預備知識:如果widget的組態檔里配置下述內容時,當用戶添加widget時會打開對應的Activity進行配置

正題:上周專案上遇到了一個bug,bug現象是:在桌面添加widget,流程是啟動app的MainActivity,這個app是一個需要授權的app,當授權流程走完了之后,發現widget并沒有添加成功,看log也沒有報錯資訊,如果添加widget的時候不走授權流程,是沒有問題,
從現象看,肯定是授權的流程有問題啦,看了代碼邏輯和activity的啟動關系,也沒有發現任何問題,然后列印widget的流程開始分析,發現widget的provider居然收到了一個“android.appwidget.action.APPWIDGET_DELETE”的廣播,這個廣播我只知道在widget被洗掉的時候才會收到,可是我又沒有做洗掉操作,這是為什么呢,,,除了用戶主動洗掉,那就只能是系統洗掉了,那么系統為什么會發這個廣播呢?開始看launcher的代碼,在里面搜appwidget相關的代碼,打log,除錯,再結合之前看得出問題的app的各個activity的生命周期,終于知道了!!
MainActivity中啟動PermissionActivity去檢查權限,然后在PermissionActivity是這樣寫的
if (!hasPermissions(activity, requiredPermissions)) { //activity:MainActivity
final Intent intent = new Intent(activity, newActivityClass);
intent.putExtra(PREVIOUS_ACTIVITY_INTENT, activity.getIntent());
activity.startActivity(intent);
activity.finish(); //有問題代碼
}
如果在widget還沒有add完成,對應的activity關閉,通俗得理解就是launcher認為用戶不想添加widget了,所以launcher就執行了洗掉操作,
把上述有問題的代碼洗掉了之后,發現還是添加不上widget,繼續比較正常和非正常情況下widget的廣播接收,發現有一個廣播在例外情況的時候沒有接收到android.appwidget.action.APPWIDGET_UPDATE_OPTIONS
這個廣播從名字看似乎跟顯示就有關系的,然后繼續捋各個activity的生命周期,又發現了!還是在PermissionActivity里
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[],
int[] grantResults) {
if (permissions != null && permissions.length > 0
&& isAllGranted(permissions, grantResults)) {
mPreviousActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(mPreviousActivityIntent); //有問題代碼,start的是MainActivity
finish();
overridePendingTransition(0, 0);
} else {
Toast.makeText(this, R.string.missing_required_permission, Toast.LENGTH_SHORT).show();
finish();
}
}
把問題處代碼注釋掉之后,一切OK,該收到的廣播也都收到了
PS:其實我并不知道我的“前任“為什么這么寫代碼:check權限的時候,如果沒有權限把MainActivity關閉,獲取了權限之后再重新開啟,雖然intent的引數全程都帶著了,但是破壞了widget的啟動流程
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/287752.html
標籤:其他
