按预期接收不同的上下文

时间:2016-01-17 16:55:39

标签: android interface broadcastreceiver android-context

我可以简短介绍: 我有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的条目来完成我的阅读,但找不到感兴趣的内容。

1 个答案:

答案 0 :(得分:0)

我认为最终设计取决于您的回调需要做什么,但考虑到广播接收器可能会在您的应用未运行时调用onReceive。 (例如,设置了闹钟,然后您的用户切换到另一个应用)。

如果您只想定期运行一些代码,而您的应用处于有效状态,我建议您使用Handler.postDelayed。如果您需要执行不涉及ui的工作(例如,在后台更新数据库),我建议Service