【问题标题】:Boot Receiver having multiple task working strangely具有多个任务的启动接收器工作异常
【发布时间】:2014-06-16 14:47:15
【问题描述】:

我的应用程序需要在启动完成后执行一些后台任务,并且还需要处于睡眠模式。 所以我使用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 类以每两小时执行一次服务器事务。但有时处理程序会随机启动,有时会停止。

所以我很困惑,我的应用程序需要两个引导接收器吗? 有没有其他选项可以在当前接收器中执行这些多项任务?

请帮忙。谢谢

【问题讨论】:

    标签: android broadcastreceiver commonsware-cwac android-handler


    【解决方案1】:

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

    不,您的第二个任务将运行一次,并且可能永远不会再次运行,因为您的进程同时终止。

    所以我很困惑,我的应用需要两个引导接收器?

    没有。

    有没有其他选项可以在当前接收器中完成这些多项任务?

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

    【讨论】:

    • 感谢您的回答。但是我有点困惑,我必须在哪里写两个警报管理器。在我的服务的 doWakefulWork() 内部或 bootreceiver 类内部。
    • @user3678972:“但我有点困惑,我必须在哪里写这两个警报管理器”——你已经有了一个。我假设您应该在配置第一个之后立即配置第二个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2012-03-20
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多