启动接收器有多个任务奇怪地工作

时间:2014-06-16 14:47:16

标签: android broadcastreceiver commonsware-cwac android-handler

我的应用程序需要在启动完成后以及睡眠模式下执行一些后台任务。 所以我使用WakefulIntentService来避免睡眠模式下的流量问题而且效果很好。 但是当我尝试使用启动接收器在启动完成后继续数据流时,它会产生一些奇怪的错误,并且有时也无法正常工作。

这是我的Boot Receiver类,我正在尝试执行多项任务。

public class OnBootReceiver extends BroadcastReceiver {

private static final int SERVICE_PERIOD = 300000; // 5 minutes currently
// private static final int HANDLER_PERIOD = 300000 * 12; // 1 hour
// currently
private static final String TAG = "OnBoot";
private Context mContext;

private int mInterval = 1000 * 60 * 60 * 2; // 2 hours by default, can be
                                        // changed later
private Handler mHandler;

@Override
public void onReceive(Context context, Intent intent) {
    mContext = context;
    AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, OnServiceReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);

    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() + 60000, SERVICE_PERIOD, pi);

    mHandler = new Handler();   
    startRepeatingTask();

}

Runnable mStatusChecker = new Runnable() {
    @SuppressWarnings("unchecked")
    @Override
    public void run() {

        SharedPreferences mSharedPreferences = mContext
                .getSharedPreferences(KEY_USER_ID, 0);
        String UserId = mSharedPreferences.getString(KEY_USER_ID, "0");
        new SyncValidater(mContext, UserId).execute();
        mHandler.postDelayed(mStatusChecker, mInterval);
    }
};

void startRepeatingTask() {
    mStatusChecker.run();
}

void stopRepeatingTask() {
    mHandler.removeCallbacks(mStatusChecker);
}
 }

在本课程中,我写了两个任务。第一个是启动另一个启动唤醒服务的广播接收器(与github example相同)。第二个启动一个处理程序,它启动一个AsyncTask类,每两个小时执行一次服务器事务。但有时处理程序会在随机时间内启动,有时会停止。

所以在这里我很困惑,我的应用程序需要两个启动接收器? 还有其他选择在当前接收器中执行这些多个任务吗?

请帮忙。感谢

1 个答案:

答案 0 :(得分:2)

  

第二个启动一个处理程序,它启动一个AsyncTask类,每两个小时执行一次服务器事务

不,您的第二个任务将运行一次,可能永远不会再运行,因为您的流程在此期间终止。

  

所以我在这里感到困惑,这是我的应用程序需要两个启动接收器?

没有

  

还有其他选项可以在当前接收器中执行这些多项任务吗?

使用两个AlarmManager个事件,每个事件都有自己的句号。一个是您当前的AlarmManager事件。另一个是你创建的,用于支持你每两个小时完成的工作。