Notitfcation 通知

雙擊系統按鈕實現退出

首先我們要獲取手機的系統back鍵,通過onKeyDown方法捕獲,實現exit邏輯
實現原理就是判斷用戶兩次按鍵的時間差是否在一個預期值之內,是的話直接直接退出,不是的話提示用戶再按一次後退鍵退出。

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK ){
            //判斷用戶兩次按鍵的時間差是否在一個預期值之內,是的話直接直接退出,不是的話提示用戶再按一次後退鍵退出。
            if(System.currentTimeMillis() - exitTime > 2000){
                Toast.makeText(this,"在點就退出",Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
                //當返回true時,表示已經完整地處理了這個事件,並不希望其他的回調方法再次進行處理,而當返回false時,
                // 表示並沒有完全處理完該事件,更希望其他回調方法繼續對其進行處理,
                return true;
            }else{
                finish(); //結束當前activity
            }
        }
        return super.onKeyDown(keyCode, event);
    }

Notitfcation 通知

什麼是通知?

定義:是在系統的通知欄中呈現多樣式持久性消息的類
1、在通知欄顯示
2、消息持久性
3、種類多樣性

在這裏插入圖片描述

Notitfcation發送一個最簡單的通知(無交互)

//獲取通知管理器:負責發送通知,清除通知
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//創建管理者
Notification.Builder builder = new Notification.Builder(MainActivity.this);
builder.setContentTitle("我是標題"); //建議設置
builder.setContentText("我是內容"); //建議設置
//設置時間
builder.setWhen(System.currentTimeMillis());
//必須設置小圖標否則報錯
builder.setSmallIcon(R.mipmap.ic_launcher);
//發送通知
//1代表通知id
manager.notify(1,builder.build());

分組通知

分組通知非常常見,它可以將App中的相同類型的消息可以合併,例如微信的通知消息層疊推出

	NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification.Builder mBuilder0 = new Notification.Builder(this);
        Notification.Builder mBuilder1 = new Notification.Builder(this);
        Notification.Builder mBuilder2 = new Notification.Builder(this);
        Notification.Builder mBuilder3 = new Notification.Builder(this);
 	//消息分組屬性,group相同才能分到一組
        mBuilder0.setGroup("2");
        mBuilder0.setSmallIcon(R.mipmap.ic_launcher);
        //被設置setGroupSummary爲true的消息會隱藏內容,其內容會顯示另外分組成員信息.
        mBuilder0.setGroupSummary(true);
        mBuilder0.setContentText("11111111");
        mBuilder0.setContentTitle("222222222");
	
	 mBuilder1.setGroup("2");
        mBuilder1.setSmallIcon(R.mipmap.ic_launcher);
//        mBuilder1.setGroupSummary(true);
        mBuilder1.setContentText("333333");
        mBuilder1.setContentTitle("44444444");
        mBuilder2.setGroup("2");
        mBuilder2.setSmallIcon(R.mipmap.ic_launcher);
//        mBuilder2.setGroupSummary(true);
        mBuilder2.setContentText("55555555555555555");
        mBuilder2.setContentTitle("66666666666");

        mBuilder3.setGroup("2");
        mBuilder3.setSmallIcon(R.mipmap.ic_launcher);
//        mBuilder3.setGroupSummary(true);
        mBuilder3.setContentText("77777");
        mBuilder3.setContentTitle("8888888");
        
	manager.notify(0,mBuilder0.build());
        manager.notify(1,mBuilder1.build());
        manager.notify(2,mBuilder2.build());
        manager.notify(3,mBuilder3.build());

進度條通知

 //獲取通知管理器:負責發送通知,清除通知
        final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //創建管理者
        final Notification.Builder builder = new Notification.Builder(MainActivity.this);
        //設置時間
        builder.setWhen(System.currentTimeMillis());
        //必須設置小圖標否則報錯
        builder.setSmallIcon(R.mipmap.ic_launcher);
        //模擬下載彈窗
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            //當前進度
            int progress;
            @Override
            public void run() {
                //設置屬性
                builder.setContentText("正在下載"+progress);
                //確定進度條
                builder.setProgress(100,progress,false);
                progress+=10;
                manager.notify(3,builder.build());
                if (progress ==100){
                    //安裝
                    builder.setContentText("正在安裝");
                    //模糊安裝
                    builder.setProgress(0,0,true);
                    manager.notify(3,builder.build());
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //取消通知id
                    manager.cancel(3);
                    timer.cancel();
                }
            }
        },0,1000);

    }
});

設置 Notification 的通知效果

PendingIntent點擊通知跳轉

PendingIntent 是一種特殊的 Intent ,字面意思可以解釋爲延遲的 Intent ,用於在某個事件結束後執行特定的 Action 。從上面帶 Action 的通知也能驗證這一點,當用戶點擊通知時,纔會執行。
PendingIntent 是 Android 系統管理並持有的用於描述和獲取原始數據的對象的標誌(引用)。也就是說,即便創建該PendingIntent對象的進程被銷燬了,這個PendingItent對象在其他進程中還是可用的。
日常使用中的短信、鬧鐘等都用到了 PendingIntent
//設置點擊跳轉的方法
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
PendingIntent activity = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

//設置意圖
builder.setContentIntent(activity);

//設置彈窗
builder.setPriority(Notification.PRIORITY_MAX);
builder.setDefaults(Notification.DEFAULT_ALL);

初次之外PendingIntent還有三種構造方法,分別對應Android中的三大組件

//獲取一個用於啓動 Activity 的 PendingIntent 對象
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags);
 
//獲取一個用於啓動 Service 的 PendingIntent 對象
public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags);
 
//獲取一個用於向 BroadcastReceiver 廣播的 PendingIntent 對象
public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)

關於flag常量值有一下四種:

FLAG_CANCEL_CURRENT:
如果當前系統中已經存在一個相同的 PendingIntent 對象,那麼就將先將已有的 PendingIntent 取消,然後重新生成一個 PendingIntent 對象。
FLAG_NO_CREATE:
如果當前系統中不存在相同的 PendingIntent 對象,系統將不會創建該 PendingIntent 對象而是直接返回 null 。
FLAG_ONE_SHOT:
該 PendingIntent 只作用一次。
FLAG_UPDATE_CURRENT:
如果系統中已存在該 PendingIntent 對象,那麼系統將保留該 PendingIntent 對象,但是會使用新的 Intent 來更新之前 PendingIntent 中的 Intent 對象數據,例如更新 Intent 中的 Extras 。

自定義通知

首先我們需要一個自定義佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <TextView
        android:text="自定義佈局"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:text="按鈕"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>
其實就是加載一個佈局.  加載佈局用到了 RemoteViews  代碼中有詳細註釋.
RemoteViews設置的佈局文件並不支持所有的View,以下是RemoteViews所支持的View:
佈局
FrameLayout,LinearLayout,RelativeLayout,GridLayout
組件
Button,ImageView,ImageButton,TextView,ProgressBar,ListView,GridView,StackView,ViewStub,AdapterViewFlipper,ViewFlipper,AnalogClock,Chronometer

java代碼:

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

    }

    public void onClick(View view) {
        //自定義一個通知
        userNotification();

    }

    private void userNotification() {
        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        Notification.Builder builder = new Notification.Builder(this);
        builder.setSmallIcon(R.mipmap.ic_launcher);//必加內容


	 /**
         * RemoteViews是可以在別的進程(系統進程)中顯示的View,並且提供了一組跨進程更新它界面的操作
         * 兩個參數,第一個佈局所在包名
         * 第二個是佈局Id
         * 佈局文件是自己創建的,隨便一個線性佈局,加一個textView和ImageView即可
         */
       RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.item);
	//加載佈局
        builder.setCustomContentView(remoteViews);
        manager.notify(1,builder.build());
    }
}

鎖屏通知

Android 5.0(API level 21)開始,通知可以顯示在鎖屏上,通過設置選擇是否允許敏感的通知內容顯示在安全的鎖屏上。

//通過 setVisibility() 方法設置即可
.setVisibility(VISIBILITY_PUBLIC)
.build();
setVisibility() 方法共有三個選值:
1.VISIBILITY_PRIVATE : 顯示基本信息,如通知的圖標,但隱藏通知的全部內容;
2.VISIBILITY_PUBLIC : 顯示通知的全部內容;
3.VISIBILITY_SECRET : 不顯示任何內容,包括圖標。
``

更新通知

更新通知很簡單,只需要再次發送相同 ID 的通知即可,如果之前的通知還未被取消,則會直接更新該通知相關的屬性;如果之前的通知已經被取消,則會重新創建一個新通知。

取消通知

設置了 setAutoCancel() 或 FLAG_AUTO_CANCEL 的通知,點擊該通知時會清除它
通過 NotificationManager 調用 cancel(int id) 方法清除指定 ID 的通知
通過 NotificationManager 調用 cancel(String tag, int id) 方法清除指定 TAG 和 ID 的通知
通過 NotificationManager 調用 cancelAll() 方法清除所有該應用之前發送的通知
通過 NotificationManager.notify(String tag, int id, Notification notify) 方法創建的通知,那麼只能通過 NotificationManager.cancel(String tag, int id) 方法才能清除對應的通知
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章