1. 程式人生 > >Android NotificationManager 和 Notification的使用總結

Android NotificationManager 和 Notification的使用總結

前言:

這段時間一直在寫一個自動檢測Apk自動更新的功能。

其中有使用到這個通知欄資訊,就一步去了解。

NotificationManager ,Notification的使用

        這裡程式碼我就沒有全部貼出來了。就貼出來了關鍵的程式碼。希望能對大家有幫助。

正文:

R.layout.download_promp佈局檔案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="8dp"
    android:id="@+id/download_notification_root"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/download_promp_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_marginLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/download_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/download_promp_info"
                android:paddingTop="8dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

        </LinearLayout>

</LinearLayout>

1.這段程式碼提供給大家演示,直接建立一個方法,把一下程式碼copy到方法內就可以使用了

       NotificationManager motificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
        Notification notification = new Notification();
        notification.icon = R.mipmap.ic_launcher_round;
        //新增聲音提示
        notification.defaults = Notification.DEFAULT_SOUND;
        /* 或者使用以下幾種方式
         * notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
         * notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
         * 如果想要讓聲音持續重複直到使用者對通知做出反應,則可以在notification的flags欄位增加"FLAG_INSISTENT"
         * 如果notification的defaults欄位包括了"DEFAULT_SOUND"屬性,則這個屬性將覆蓋sound欄位中定義的聲音
         */
        //audioStreamType的值必須AudioManager中的值,代表響鈴模式
        notification.audioStreamType = AudioManager.ADJUST_LOWER;
        //新增LED燈提醒
        notification.defaults |= Notification.DEFAULT_LIGHTS;
        //或者可以自己的LED提醒模式:
        /*notification.ledARGB = 0xff00ff00;
        notification.ledOnMS = 300; //亮的時間
        notification.ledOffMS = 1000; //滅的時間
        notification.flags |= Notification.FLAG_SHOW_LIGHTS;*/
        //新增震動
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        //或者可以定義自己的振動模式:
        /*long[] vibrate = {0,100,200,300}; //0毫秒後開始振動,振動100毫秒後停止,再過200毫秒後再次振動300毫秒
        notification.vibrate = vibrate;*/
        //狀態列提示資訊
        notification.tickerText = mUpdateInfo.getAppname()+" 發現新版本,點選下載";
        //獲取當前時間
        notification.when = System.currentTimeMillis();
        //載入自定義佈局
        notification.contentView = getRemoteViews(context,"發現新版本,點選下載");
        // 點選清除按鈕或點選通知後會自動消失
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        //開始顯示訊息
        motificationManager.notify(0, notification);

2、這段是我們自定義的通知欄佈局

    //自定義notification佈局
    public static RemoteViews getRemoteViews(Context context,String info) {
        RemoteViews remoteviews = new RemoteViews(context.getPackageName(),R.layout.download_promp);
        remoteviews.setImageViewResource(R.id.download_promp_icon,R.mipmap.ic_launcher_round);
        remoteviews.setTextViewText(R.id.download_title,mUpdateInfo.getAppname());
        remoteviews.setTextViewText(R.id.download_promp_info,info);
        //找到對應的控制元件(R.id.download_notification_root),為控制元件新增點選事件getPendingIntent(context)
        remoteviews.setOnClickPendingIntent(R.id.download_notification_root,getPendingIntent(context));
        return remoteviews;
    }
R.id.download_notification_root),為控制元件新增點選事件getPendingIntent(context) remoteviews.setOnClickPendingIntent(R.id.download_notification_root,getPendingIntent(context)); return remoteviews; }
    /**
     * 給通知欄新增點選事件,實現具體操作,我們這裡將資訊傳送到Service中,在服務中去做具體操作。也可以不將資訊傳送到Service中
     * @param context 上下文
     * @return
     */
    private PendingIntent getPendingIntent(Context context) {
        Intent intent = new Intent(context,UpdateService.class);
        intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("msg","Test傳送到Service");
        PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,0);
        return pendingIntent;
    }
 @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
	//這個是在Service中的onStart() 中去獲取資訊
        String msg = getIntent().getStringExtra("msg");
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();

    }	//這個是在Service中的onStart() 中去獲取資訊
        String msg = getIntent().getStringExtra("msg");
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();

    }

或者我們將資訊傳送到我們需要接受的Activity中,並且在Activity中的onCreate中去獲取訊息。

 private PendingIntent getPendingIntent() {
        Intent intent = new Intent(this,MainActivity.class);
        intent.putExtra("msg","從通知欄點選進來的");
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent;
    }
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String msg = getIntent().getStringExtra("msg");
        Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
    }

接下來可以檢視一下別的博主寫的:

====》

博主寫的很不錯,細節都做的很詳細。可以提供給我們學習使用。點選開啟連結

(1)、使用系統定義的Notification

以下是使用示例程式碼:

//建立一個NotificationManager的引用
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager)getSystemService(ns);
// 定義Notification的各種屬性
int icon = R.drawable.icon; //通知圖示
CharSequence tickerText = "Hello"; //狀態列顯示的通知文字提示
long when = System.currentTimeMillis(); //通知產生的時間,會在通知資訊裡顯示
//用上面的屬性初始化 Nofification
Notification notification = new Notification(icon,tickerText,when);
/*
* 新增聲音
* notification.defaults |=Notification.DEFAULT_SOUND;
* 或者使用以下幾種方式
* notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
* notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
* 如果想要讓聲音持續重複直到使用者對通知做出反應,則可以在notification的flags欄位增加"FLAG_INSISTENT"
* 如果notification的defaults欄位包括了"DEFAULT_SOUND"屬性,則這個屬性將覆蓋sound欄位中定義的聲音
*/
/*
* 新增振動
* notification.defaults |= Notification.DEFAULT_VIBRATE;
* 或者可以定義自己的振動模式:
* long[] vibrate = {0,100,200,300}; //0毫秒後開始振動,振動100毫秒後停止,再過200毫秒後再次振動300毫秒
* notification.vibrate = vibrate;
* long陣列可以定義成想要的任何長度
* 如果notification的defaults欄位包括了"DEFAULT_VIBRATE",則這個屬性將覆蓋vibrate欄位中定義的振動
*/
/*
* 新增LED燈提醒
* notification.defaults |= Notification.DEFAULT_LIGHTS;
* 或者可以自己的LED提醒模式:
* notification.ledARGB = 0xff00ff00;
* notification.ledOnMS = 300; //亮的時間
* notification.ledOffMS = 1000; //滅的時間
* notification.flags |= Notification.FLAG_SHOW_LIGHTS;
*/
/*
* 更多的特徵屬性
* notification.flags |= FLAG_AUTO_CANCEL; //在通知欄上點選此通知後自動清除此通知
* notification.flags |= FLAG_INSISTENT; //重複發出聲音,直到使用者響應此通知
* notification.flags |= FLAG_ONGOING_EVENT; //將此通知放到通知欄的"Ongoing"即"正在執行"組中
* notification.flags |= FLAG_NO_CLEAR; //表明在點選了通知欄中的"清除通知"後,此通知不清除,
* //經常與FLAG_ONGOING_EVENT一起使用
* notification.number = 1; //number欄位表示此通知代表的當前事件數量,它將覆蓋在狀態列圖示的頂部
* //如果要使用此欄位,必須從1開始
* notification.iconLevel = ; //
*/
//設定通知的事件訊息
Context context = getApplicationContext(); //上下文
CharSequence contentTitle = "My Notification"; //通知欄標題
CharSequence contentText = "Hello World!"; //通知欄內容
Intent notificationIntent = new Intent(this,Main.class); //點選該通知後要跳轉的Activity
PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
//把Notification傳遞給 NotificationManager
mNotificationManager.notify(0,notification);
如果想要更新一個通知,只需要在設定好notification之後,再次呼叫 setLatestEventInfo(),然後重新發送一次通知即可,即再次呼叫notify()。
(2)、使用自定義的 Notification
要建立一個自定義的Notification,可以使用RemoteViews。要定義自己的擴充套件訊息,首先 要初始化一個RemoteViews物件,然後將它傳遞給Notification的contentView欄位,再把PendingIntent傳遞給 contentIntent欄位。以下示例程式碼是完整步驟:
//1、建立一個自 定義的訊息佈局 view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageView android:id="@+id/image" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:layout_marginRight="10dp" />
<TextView android:id="@+id/text" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:textColor="#000" />
</LinearLayout>
//2、 在程式程式碼中使用RemoteViews的方法來定義image和text。然後把RemoteViews物件傳到contentView欄位
RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.view);
contentView.setImageViewResource(R.id.image,R.drawable.icon);
contentView.setTextViewText(R.id.text,”Hello,this message is in a custom expanded view”);
notification.contentView = contentView;
//3、 為Notification的contentIntent欄位定義一個Intent(注意,使用自定義View不需要 setLatestEventInfo()方法)
Intent notificationIntent = new Intent(this,Main.class);
PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
notification.contentIntent = contentIntent;
//4、傳送通知
mNotificationManager.notify(2,notification);
// 以下是全部示例程式碼
//建立一個 NotificationManager的引用
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager)getSystemService(ns);
// 定義Notification的各種屬性
int icon = R.drawable.icon; //通知圖示
CharSequence tickerText = "Hello"; //狀態列顯示的通知文字提示
long when = System.currentTimeMillis(); //通知產生的時間,會在通知資訊裡顯示
//用上面的屬性初始化 Nofification
Notification notification = new Notification(icon,tickerText,when);
RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.view);
contentView.setImageViewResource(R.id.image, R.drawable.iconempty);
contentView.setTextViewText(R.id.text, "Hello,this is JC");
notification.contentView = contentView;
Intent notificationIntent = new Intent(this,Main.class);
PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
notification.contentIntent = contentIntent;
//把Notification傳遞給NotificationManager
mNotificationManager.notify(0,notification);

《=====