我创建一个闹钟,每隔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:我打开应用程序,将其置于后台(按主页按钮),然后打开任务管理器并从内存中清除应用程序。几次警报停止,但警报仍然有几次仍然存在。有人可以帮我解释一下吗?
答案 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()方法中完成工作。那会更好。希望它会有所帮助。谢谢。