0

我已经在我的MainActivity类中设置了AlarmManager。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 

} 

回答

1

启动一个AsyncTaskBroadcastReceiver是错误的,原因有二:

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

一个BroadcastReceiver对象仅适用于 呼叫onReceive(Context, Intent)的持续时间。一旦你的代码从这个 函数返回,系统就认为该对象已经完成并且不再起作用 .....任何需要异步操作的东西都不是 可用的,因为您需要从该函数返回以处理异步操作 ,但此时BroadcastReceiver 不再处于活动状态,因此系统可自由地终止其进程 异步操作完成。

2.Context实例onReceive()提供的是不一样的 或ActivityServiceContext,即Activity.thisService.this。您需要合适的Context来执行我们通常从ActivityService执行的许多常见的有用操作 。因此,举例来说,正确的方式开始在Service
onReceive()是:

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

,而不是

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

Perfecto!但考虑到你说的第一个原因,我们从'onReceive()'开始的服务是否会在代码从这个函数返回之后终止? – Nikhil 2015-03-02 12:00:31

+1

不,“Service”是一个完全独立的组件,它与“BroadcastReceiver”的生命周期没有任何关系......所以你不应该担心这一点。 “服务”可以在完成工作后停止。 – 2015-03-02 12:02:14

+0

不错!谢谢! :) – Nikhil 2015-03-02 12:03:49

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); 
    } 
+0

通过启动另一个服务,是我们移除时间限制? – Nikhil 2015-03-02 11:09:54

+0

请看我编辑的问题,我添加了Parsing.java类。 – Nikhil 2015-03-02 11:12:42