我遇到了这个问题,我正在清单中为AlarmManager注册我的广播接收器。我正在通过挂起的意图在我的活动中安排它。
AlarmManager alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent =PendingIntent.getBroadcast(this, 0, new Intent(this, AlarmReciever.class),PendingIntent.FLAG_CANCEL_CURRENT);
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, Constants.ALARM_TRIGGER_AT_TIME,Constants.ALARM_INTERVAL, pendingIntent);
但是在我的接收器类中,我正在使用 AlarmManager 进行一些网络更新......我正在保存在数据库中。我在活动中有一个列表适配器,需要通知数据集已更改...为此,我需要我的活动实例。
如何获得它?基本上,我想至少在我的应用程序可见时更新我的 UI。
活动中创建一个BroadcastReceiver
,在活动onResume
中注册它,然后在 onPause
中取消注册。完成后 网络更新 ,创建一个Intent
,输入要发送到活动的所有数据并触发它。如果您的活动位于前台,则只有它会收到此意图。从活动中onReceive()
BroadcaseReceiver
,您可以获取所有数据,然后更新 UI。
在您的活动中创建一个BroadcastReceiver
::
private class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
/////// update your UI from here ////////
}
}
在 onCreate()
中,创建此接收器的实例 ::
myReceiver=new MyReceiver();
从OnResume()
注册此接收器 ::
IntentFilter filter=new IntentFilter();
filter.setPriority(1);
filter.addAction( "MyPackageName.MyAction" );
registerReceiver(myReceiver, filter);
在onPause()
中取消注册 ::
unregisterReceiver( myReceiver );
现在,在完成网络更新后触发一个意图来启动此接收器::
Intent broadcastIntent=new Intent();
broadcastIntent.setAction( "MyPackageName.MyAction" );
broadcastIntent.putExtra();// put data to send to your activity
sendBroadcast( broadcastIntent );
我得到了答案。用于刷新可见的活动
Intent i=new Intent(caller,Dot.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
caller.startActivity(i);
如果活动可见,它将在代码中调用 OnNewIntent(),从而调用 onResume(),您可以在其中更新您的 UI。