Android:在后台重复任务。我的方法是否正确?

时间:2015-07-18 06:38:50

标签: java android

我在后台阅读了几个关于重复异步任务的线程,我首先使用这种方式:https://stackoverflow.com/a/6532298但由于某些原因,似乎在某个时间(几个小时)后,它停止了。

所以,现在我正在使用这种方式,但我不知道这是否是一个好的方法:

广播接收器

public class RetrieveDataTaskBroadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        SharedPreferences mSharedPreferences = context.getSharedPreferences(MY_PREF, 0);
        int delayInMs = mSharedPreferences.getInt("set_delay_refresh", 20)*60*1000; 
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, RetrieveDataService.class);
        PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
        am.cancel(pi);
        if (delayInMs > 0) {
            am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    SystemClock.elapsedRealtime() + delayInMs,
                    delayInMs, pi);
        }
    }

}

我的服务类:

public class RetrieveDataService extends Service implements OnRefreshInterface {

    private Context context;
    private PowerManager.WakeLock mWakeLock;
    private static final String TAG = "REFRESH_SERVICE";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private void handleIntent(Intent intent) {
        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
        mWakeLock.acquire();

        //do the work
       callAsynchronousTask();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handleIntent(intent);
        return START_NOT_STICKY;
    }

    public void onDestroy() {
        super.onDestroy();
        mWakeLock.release();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
        callAsynchronousTask();
    }

    public void callAsynchronousTask() {
        //My asynchronous task => execute a class that extends AsyncTask
        [...]
    }

    @Override
    public void onRefreshInterface(int cb_val1, int cb_val2) {
        //Callback when refresh is done
        [...]
    }
}

的AndroidManifest.xml:

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

...
    <service
        android:name="com.example.package.RetrieveDataService"
        android:enabled="true"
        android:label="Refresh Data">
    </service>

    <receiver
        android:name="com.example.package.RetrieveDataTaskBroadcast"
        android:enabled="true"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

我还添加了一种在应用启动时启动服务的方法: MainActivity:

@Override
    protected void onResume() {
        super.onResume();
        Thread t = new Thread(){
            public void run(){
                SharedPreferences mSharedPreferences = getSharedPreferences(PREF, 0);
                int delayInMs = mSharedPreferences.getInt("set_delay_refresh", 20)*60*1000; 
                AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                Intent i = new Intent(MainBaseActivity.this, RetrieveDataService.class);
                PendingIntent pi = PendingIntent.getService(MainBaseActivity.this, 0, i, 0);
                am.cancel(pi);
                am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                            SystemClock.elapsedRealtime() + delayInMs,
                            delayInMs, pi);
            }
        };
        t.start();
    }

感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:1)

设备启动时,您不需要服务即可启动重复任务。当设备关闭时,您的任务将永远不会运行。

您可以使用Alarm Manager设置重复闹钟。 如果您指定的触发时间是设备关闭时的过去时间,则设备开启时会立即触发警报。

检查一下 - https://developer.android.com/training/scheduling/alarms.html