【问题标题】:Is my Activity 'active'? [duplicate]我的活动“活跃”吗? [复制]
【发布时间】:2017-09-22 23:34:48
【问题描述】:

我的应用只包含一个活动 (launchMode=singleTask),其中包含一个 viewpager。在应用程序中,用户通过 AlarmManager 安排警报。当这些警报被触发时,广播接收器会在状态栏中创建通知(无论应用是否打开)。

每当发出通知并且活动处于前台时,我想更新活动中的 RecyclerView。如果活动在后台或根本不“活动”(不存在),则无需将其调用到前面或打开它只是为了更新 RecyclerView。

如何在调用“MyActivity.updateMyRecyclerView()”之前检查我的活动是否存在? (我对如何检查它是否在前台有一个想法,我认为这不是问题。)

【问题讨论】:

  • 您可以将您的活动注册为广播接收器本身并在触发警报时发送您自己的广播(自定义类型)吗?然后活动可以更新自己的回收站视图。
  • 你想要哪一个?检查活动的特定前景或检查应用程序的前景?如果您只想调用 MyActivity.updateMyRecyclerView(),您可以创建广播接收器并将“updateMyRecyclerView”代码放入该广播,然后将广播接收器注册到 LocalBroadcastReceiver。我使用这种方式从 Firebase.onMessageReceived 服务更新回收站视图

标签: android


【解决方案1】:

您可以为您的活动使用广播接收器。您可以发送广播,如果您的活动“活跃”并且已注册接收广播,您可以从那里触发 recyclerView 更新。

在创建这样的通知时发送广播

Intent intent = new Intent("key_to_identify_the_broadcast");
Bundle bundle = new Bundle();
bundle.putBoolean("updateRecyclerView",true);
intent.putExtra("bundle_key_for_intent", bundle);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

在您想要接收此意图的 Activity 中,您可以使用广播接收器

  private final BroadcastReceiver mHandleMessageReceiver = new 
  BroadcastReceiver() {
     @Override
     public void onReceive(Context context, Intent intent) {
    Bundle bundle = 
        intent.getExtras().getBundle("bundle_key_for_intent");
        if(bundle!=null){
            boolean shouldRefresh = bundle.getBoolean("updateRecyclerView");
            if(shouldRefresh){
               //Refresh your recyclerView
            }
        }

 }
};

你需要注册和注销接收器才能工作

在你的 onResume 方法中你可以注册这个接收器来接收广播

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    IntentFilter filter = new IntentFilter("key_to_identify_the_broadcast");
    LocalBroadcastManager.getInstance(this)
    .registerReceiver(mHandleMessageReceiver,filter);
}

您还需要在活动暂停之前取消注册

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    try {
     LocalBroadcastManager.getInstance(this)
         .unregisterReceiver(mHandleMessageReceiver);

  } catch (Exception e) {
    Log.e("UnRegister Error", "> " + e.getMessage());
  }
}

【讨论】:

猜你喜欢
  • 2012-11-13
  • 2011-10-27
  • 1970-01-01
  • 2012-06-12
  • 2010-09-07
  • 1970-01-01
  • 2013-11-12
  • 2019-08-30
  • 2020-05-05
相关资源
最近更新 更多