關於Activity無法從後臺啓動或者啓動延遲5s的問題解決方案

對於Android第三方應用來講,免不了有那種當應用按返回鍵或者home鍵退回後臺後,來一個消息觸發彈出界面的需求(雖然google不提倡這麼做),比如類似於微信的音視頻呼叫。
這個時候就需要Activity從Service啓動或者從receiver啓動,按照常規的做法會這麼寫:

Intent intent = new Intent(context, xxx.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

但是google的Android系統版本從9.0之後就開始不支持這些做法,如果還是這麼寫的話就無法啓動Activity或者延遲5S才啓動。原因系統對ActivityManagerService 做了修改,改動說明很容易搜到,這裏不做描述。
爲此可以這樣修改:
Intent intent = new Intent(context, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent =
PendingIntent.getActivity(context, 0, intent, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}

但這種改動並不完美,有些機型會出現異常,而且對老的版本不兼容,我們不妨可以這樣處理:
Intent intent = new Intent(context, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent =
PendingIntent.getActivity(context, 0, intent, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
context.startActivity(intent);
e.printStackTrace();
}
雖說在異常處理catch裏面不應該做與異常處理無關的事情,但這樣做卻可以兼容不同的安卓版本和機型,目前測試未出現什麼問題。不知道有沒有其他比較的處理方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章