为什么我的 onResume 被调用了两次?

基本上,这就是我正在做的

1) 设置报警管理器以执行广播接收器 (BCR)

Intent intent = new Intent(m_Context, BCR.class);  
intent.putExtras(extras);  
PendingIntent pendingIntent = PendingIntent.getBroadcast(m_Context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);  
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, StartTime, pendingIntent)  

2) 从 BCR 启动 MyActivity

@Override  
public void onReceive(Context context, Intent intent) {  
    Intent newIntent = new Intent(context, MyActivity.class);
    newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);  
    context.startActivity(newIntent);  
}

3)让MyActivity打开屏幕,如果它没有打开

@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState); 
    getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
    getWindow().addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);
    setContentView(R.layout.myactivity);  
} 

@Overide  
protected void onNewIntent(Intent intent) {  
    super.onNewIntent(intent);  
}  

出于某种原因,我注意到当MyActivity打开时,它的流量是这样的:

onCreate/onNewIntent -> onResume -> onPause -> onResume

我不确定为什么它会立即进行 onPause。我注意到这只发生在屏幕被标志打开时。有谁知道为什么会发生这种情况?有什么方法可以防止这种行为吗?


答案 1

为了以防其他人遇到这种情况,我似乎只有在通过XML布局将活动内部的片段膨胀时才会注意到这种行为。我不知道这种行为是否也发生在 Fragments 的兼容性库版本上(我使用的是 android.app.Fragment)

活动似乎在调用任何添加的片段之前将调用一次,然后再次调用。Activity#onResumeFragment#onResumeActivity#onResume

  1. 活动:上创建
  2. 片段:上附加
  3. 活动:附件上碎屑
  4. 片段:上创建
  5. 活动: 启动
  6. 活动: 继续
  7. 片段:上复活
  8. 活动: 继续

答案 2

如果您每次都尝试请求权限都可能导致此类问题,只需检查您是否已经授予了权限

requestPermissions可能导致它:

onCreate
onStart
onResume
onPause
onResume

使用此方法 ContextCompat.checkSelfPermission(context, permission) 在请求权限之前检查是否授予了权限

此方法返回,您可以使用常量检查它intPackageManager.PERMISSION_GRANTED


推荐