我可以简短介绍:
我有MainActivity
实现SomeInterface
,一个名为HeadlessFragment
的无头状态片段。
HeadlessFragment
正在onAttach
方法设置警报(符合API 18):
Fragment Code
----------------
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (SomeInterface) activity; //HERE IT WORKS!!!
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement SomeInterface");
}
//create the Intent for MyBroadCast
mIntent= new Intent(activity, MyBroadCast.class);
mPendingIntent = PendingIntent.getBroadcast(activity, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//Set up the Alarm
mAlarmManager = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
mAlarmManager.cancel(mPendingIntent );
mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 2000, 10000, mPendingIntent );
}
现在我希望这个activity
变量能够传递给MyBroadCast
,所以我实现了MyBroadCast's onReceive
如下:
BroadCast Code
-----------------
public void onReceive(Context c, Intent indent) {
mContext = c;
try {
// HERE IT DOESN'T WORK - ClassCastException is thrown
SomeInterface callback = (SomeInterface) c;
callback.SomeInterfaceMethod(s);
} catch (ClassCastException e) {
throw new ClassCastException(c.toString()
+ " must implement SomeInterface");
}
}
不幸的是,它不起作用,因为我无法进行此演员,并且显然在PendingIntent
或警报机制中出现了上下文错误,但我不知道如何进一步调查。在我完全改变我的设计之前,这里有人对这个问题有特别/重要的见解吗?
当然,我通过浏览developer.android API文档中上下文中的Fragments,Intents,Broadcastreceivers的条目来完成我的阅读,但找不到感兴趣的内容。
答案 0 :(得分:0)
我认为最终设计取决于您的回调需要做什么,但考虑到广播接收器可能会在您的应用未运行时调用onReceive
。 (例如,设置了闹钟,然后您的用户切换到另一个应用)。
如果您只想定期运行一些代码,而您的应用处于有效状态,我建议您使用Handler.postDelayed
。如果您需要执行不涉及ui的工作(例如,在后台更新数据库),我建议Service
。