前言
最近在寫 Notification 的 Demo逻炊,梳理 Notification 的各種樣式以及點(diǎn)擊 Notification 啟動(dòng) Activity 的各種方式。
所有的 app 點(diǎn)擊通知欄啟動(dòng) Activity 的方式不外乎以下三種:
- 如果要啟動(dòng)的 app 已經(jīng)被殺掉炭剪,則啟動(dòng)主界面,否則啟動(dòng)棧頂?shù)?Activity;
- 啟動(dòng)特定的 Activity涯冠,不管當(dāng)前 app 有沒有被殺掉,點(diǎn)擊后退鍵后返回到當(dāng)前 app 的主界面逼庞,例如微信蛇更、QQ等等;
- 啟動(dòng)特定的 Activity赛糟,啟動(dòng)前判斷派任,如果當(dāng)前程序沒有被殺掉且除了當(dāng)前被啟動(dòng)的 Activity 外至少有一個(gè) Activity 沒有被 finish,點(diǎn)擊后退鍵則返回到之前棧頂?shù)?Activity璧南;如果當(dāng)前程序被殺掉或之前任務(wù)棧沒有 Activity掌逛,點(diǎn)擊后退鍵則返回到當(dāng)前 app 的主界面,例如網(wǎng)易云音樂穆咐。
上面的第三種啟動(dòng)方式需要判斷 app 中是否有暫時(shí)沒有被 finish 的 Activity颤诀。
很遺憾,Google 官方并沒有給我們提供類似的方法去做判斷对湃,但這不妨礙我們自己去深究這個(gè)問題崖叫,這個(gè)問題就要牽涉到 app 的 Activity 管理。
之前我們是如何實(shí)現(xiàn)的拍柒?
我剛開始做項(xiàng)目的時(shí)候心傀,管理 Activity 的方式是在 BaseActivity 中維護(hù) Activity 的 List,在 OnCreate() 和 onDestroy() 調(diào)用 add 和 remove 拆讯,但是如果 Activity 沒有繼承封裝的 BaseActivity脂男,那每個(gè) Activity 就都要在 onCreate() 中寫維護(hù) BaseActivity 中的 List 的代碼,同時(shí)當(dāng) Activity 銷毀時(shí)种呐,也要從 List 中將此 Activity 移除等等宰翅,這樣搞下來,一旦 Activity 特別多的時(shí)候爽室,說不定哪次就忘了汁讼,出了問題了也不好追蹤。
那應(yīng)該如何解決阔墩?
喜大普奔嘿架。
Google 親大爺知道我們想要什么,想什么來什么啸箫,一次一次的給我們這些 Android 搬磚工們帶來了一個(gè)又一個(gè)的福音耸彪。
這不,從 API 14 開始忘苛,Application 中多了一個(gè)方法:registerActivityLifecycleCallbacks
顧名思義蝉娜,注冊(cè) Activity 生命周期回調(diào)唱较,可以全局監(jiān)聽 Activity 的生命周期。因此我們可以從 Application 中全局監(jiān)聽所有>Activity 并對(duì)其進(jìn)行管理召川。
初始化 List
private List<Activity> list = Collections.synchronizedList(new LinkedList<Activity>());
添加 Activity
public void addActivity(Activity activity) {
if (activity == null)
return;
list.add(activity);
}
刪除 Activity
public void removeActivity(Activity activity) {
if (activity == null)
return;
list.remove(activity);
}
注冊(cè)回調(diào)
在回調(diào)的 onActivityCreated() 方法中添加 Activity绊汹,在 onActivityDestroyed() 方法中刪除 Activity
private void registerActivityListener() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
addActivity(activity);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
removeActivity(activity);
}
});
}
判斷
public boolean isAllActivityFinished() {
return list == null || list.isEmpty();
}
最后別忘了在 AndroidManifest.xml 中設(shè)置 Application 的 name。
你也可以獲取棧頂 Acitivty以及 finish 某個(gè)特定的 Activity 等等扮宠。
詳見:NotificationDemo