通过任务管理器终止应用程序时终止警报任务

时间:2015-03-12 12:13:19

标签: android alarmmanager

我创建一个闹钟,每隔30秒检索一次位置,如下所示:

public class AlarmReceiver extends BroadcastReceiver {
    public static final String LOG_TAG = "AlarmReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(LOG_TAG, "requesting location tracking.");

        // start the service
        Intent tracking = new Intent(context, LocationUpdateManager.class);
        context.startService(tracking);
    }
}

以下是来自MainActivity的调用以启动位置更新

private void startTracking(Context context) {
    Log.i(LOG_TAG, "startTracking()");

    // get a Calendar object with current time
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.SECOND, START_DELAY);

    Intent intent = new Intent(context, AlarmReceiver.class);
    trackingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), UPDATE_INTERVAL, trackingIntent);
}

这是停止位置更新的电话:

public void stopTracking() {
    Log.i(LOG_TAG, "stopTracking()");

    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    trackingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    alarms = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    alarms.cancel(trackingIntent);
}

在这个应用程序中,每当应用程序终止(通过任何方式)我也想停止警报(即停止更新位置)。为此,我在onDestroy()中调用了stopTracking():

protected void onDestroy() {
    Log.i(LOG_TAG, "onDestroy()");

    stopTracking();

    super.onDestroy();
}

我已经在三星Galaxy S4上多次测试 - 4.4.2:我打开应用程序,将其置于后台(按主页按钮),然后打开任务管理器并从内存中清除应用程序。几次警报停止,但警报仍然有几次仍然存在。有人可以帮我解释一下吗?

1 个答案:

答案 0 :(得分:0)

你可以使用应用程序类。应用程序的类实例将一直可用,直到应用程序未关闭或被杀死(未最小化)。当应用程序被杀死时,将调用此类的终止。请参阅下面的代码。

public class MyApp extends Application {

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public void onTerminate() {
    super.onTerminate();

    //do your code here.
}

}

不要忘记将此实例添加到AndroidManifest.xml文件中。

   <application
    android:name=".MyApp"
    android:allowBackup="true"
    android:label="@string/app_name" >
   </application>

但正如@waqaslam所建议的那样,你不应该依赖于此,因为没有人会在Real device Reference here中调用它。

在用户从“最近的应用程序”屏幕或任务管理器中杀死应用程序之前,还有一个更好的事情是,总是会调用onPause()的运行活动。所以你需要保存所有数据或者在onPause()方法中完成工作。那会更好。希望它会有所帮助。谢谢。