我正在开发一个Android应用程序,我的应用程序打开手机上的一些硬件。 如果有人杀死我的申请,我想关闭硬件。 如何“捕获”kill命令/事件/信号并在应用程序退出之前进行清理?
有些更新我发现的内容。 您不能保护您的应用程序在所有情况下都不会被杀死。 不保证调用onDestroy()(例如,在OOM杀手的情况下,或者用户调用killall -9 xxx)。 你可以做的最好是实现onDestroy()函数,为sig_term添加处理程序,并将你的应用程序注册为超出OOM杀手的范围。
这应该处理90%的案件。 所有其他情况都来自特定的用户活动 - 所以他会得到我们想要的东西......
答案 0 :(得分:6)
覆盖主活动上的 onDestroy(),以便在您的应用被销毁时执行代码,或 onStop()以在用户退出应用时执行代码。
onDestroy():在销毁活动之前调用。这是活动将收到的最终通话。它可以被调用,因为活动正在完成(有人称为finish()),或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。
onStop():当用户不再看到该活动时调用。这可能是因为它正在被销毁,或者因为另一个活动(现有的或新的活动)已经恢复并且正在覆盖它。如果活动回来与用户交互,则由onRestart()关注,或者如果此活动消失,请通过onDestroy()。
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
} }
我强烈建议您阅读Activities
答案 1 :(得分:2)
如何“捕获”kill命令/事件/信号并在应用程序退出之前进行清理?
你不能。
如果活动正在使用硬件,请在onPause()
中将其释放。
如果多个活动正在使用硬件,则需要通过一些带有引用计数的回转来安排在最后一个活动暂停时释放它。
如果硬件被其他东西使用,则会遇到问题。
答案 2 :(得分:1)
onPause()方法出现在活动生命周期中的onStop()方法之前。您的应用程序可能会在暂停时被停用,或者当停止时,您可能希望在onPause中添加isFinishing()方法来清理。您不必在停止时执行此操作,因为暂停将在停止之前初始化。如果您在暂停时被杀,则无法保证执行onStop()。
@Override
protected void onPause() {
super.onPause();
//pause actions
if (isFinishing()) {
//checks to see if activity is finishing
//type your code to execute clean up here
}
}
有关更多详细信息,请参阅isFinishing(): developer.android.com/reference/android/app/Activity.html#isFinishing()
答案 3 :(得分:0)
将清理代码放在onDestroy()方法中,这是在活动最终关闭之前调用的最后一个方法。有关Android活动生命周期的所有信息,请查看Android lifecycle