AlarmManager - 我做得对吗?

时间:2015-03-02 09:55:13

标签: android broadcastreceiver android-service alarmmanager android-broadcast

我在我的MainActivity课程中设置了AlarmManager。

一个名为AlarmReceiver的类会在每个设定的时间间隔内被激活。

我必须在该类启动时执行操作。该代码位于另一个类Parsing.java

现在在 AlarmReceiver.java 中,我这样做:

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Parsing obj = new Parsing(context);

        obj.execute();

    }
}

我无法直接在AlarmReceiver.java中编写代码,因为AlarmReceiver.java已经在扩展BroadcastReceiver而我的代码Parsing.java正在扩展另一个类。

所以,我正在为Parsing类创建一个对象并调用该方法。

我的方法是否正确?

如果需要,我会提供更多信息。 如果我的方法是正确的,请告诉我? 提前谢谢!

修改

Parsing.java

public class Parsing extends AsyncTask<Void, Void, Void> {

//some code

}

2 个答案:

答案 0 :(得分:1)

我不知道您是如何编写Parsing.java的,它看起来不错但请记住这个

  

除非您明确要求使用registerReceiver在不同的线程上调度此方法,否则始终在其进程的主线程内调用此方法。当它在主线程上运行时,你永远不应该在其中执行长时间运行的操作(在考虑阻塞接收器和被杀死的候选者之前,系统允许超时10秒)。您无法在onReceive()

的实现中启动弹出对话框

对我而言,我认为处理此问题的更好方法是在onReceive方法中调用另一个服务,就像这样

@Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, ParsingService.class);
        context.startService(i);
    }

答案 1 :(得分:1)

AsyncTask开始BroadcastReceiver是错误的,原因有两个:

1。方法返回后,onReceive()运行的线程终止,有效地结束了可能从那里开始的任何长时间运行的任务。引用官方docs

  

BroadcastReceiver对象仅在其持续时间内有效   致电onReceive(Context, Intent)。一旦你的代码从此返回   功能,系统认为要完成的对象不再   有效.....任何需要异步操作的东西都不是   可用,因为您需要从函数返回来处理   异步操作,但此时BroadcastReceiver   不再是活动的,因此系统可以自由地杀死它的进程   在异步操作完成之前。

2。 Context提供的onReceive()实例不同于 ContextActivity的{​​{1}},即ServiceActivity.this。您需要适当的Service.this来执行许多操作 我们通常从Context或。{ Activity。因此,例如,正确的方式来启动Service Service是:

onReceive()

而不是

@Override
public void onReceive(Context context, Intent intent) {
    Intent i = new Intent(context.getApplicationContext(), ParsingService.class);
    context.getApplicationContext().startService(i);
}