28

当我们按下这个按钮

我们看到我们没有关闭的应用程序,就像这样

但是当我们想从这个屏幕(下图)关闭应用程序时,不会调用 onDestroy() 方法,但是应用程序会关闭。当应用程序以这种方式关闭时,我需要调用 onDestroy() 。我怎样才能做到这一点?

4

3 回答 3

35

正如 Android 文档中所指定的,不能保证onDestroy()在退出应用程序时会调用它。

“在某些情况下,系统会简单地终止活动的托管进程而不调用此方法”

https://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29

相反,您可以创建一个服务,当您的活动在其中运行的任务被销毁时,该服务将得到通知。

创建服务类:

public class ClosingService extends Service {

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

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);

        // Handle application closing
        fireClosingNotification();

        // Destroy the service
        stopSelf();
    }
}

在清单中声明/注册您的服务(在应用程序标签内,但在任何活动标签外):

<service android:name=".services.ClosingService"
             android:stopWithTask="false"/>

当从流程中删除任务时,指定stopWithTask="false"将导致在您的服务中触发该方法。onTaskRemoved()

stopSelf()在调用销毁服务之前,您可以在此处运行关闭应用程序逻辑。

于 2017-01-19T15:07:42.477 回答
1

你应该阅读一些关于 Activity 生命周期的信息。onDestroy 方法有一件事,它不会一直被调用。你不能依赖它。

请指定您要达到的目标,我会尽力提供更好的解决方案。

建议

所以,如果我理解你的话,我可以建议一件事。启动一个每 N 秒Service触发LocalBroadcast一次(对系统来说并不是很重)。在 中注册并BroadcastReceiver为此广播Activities。这样,您将获得truefalse取决于是否有任何BroadcastReceiver可以捕获您的LocalBroadcast. 如果没有接收器,则检查SharedPreferences指示是否Button按下的某个值。

于 2017-01-19T15:07:06.517 回答
0

比使用绑定服务更有前途的方法是在Application中使用活动生命周期回调。尽管接受的答案中显示的方法可行,但服务将在后台运行,直到活动终止,这很昂贵。相反,我建议使用您的Application实现。

1)制作一个扩展Application的类,然后通过在Manifest文件中Application标签的name属性中提供其名称来使用它

class MusicPlayerApplication: Application() {
    private val TAG = MusicPlayerApplication::class.java.simpleName

    override fun onCreate() {
        super.onCreate()

        registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
            override fun onActivityPaused(activity: Activity?) {

            }

            override fun onActivityResumed(activity: Activity?) {
            }

            override fun onActivityStarted(activity: Activity?) {
            }

            override fun onActivityDestroyed(activity: Activity?) {
                Log.d(TAG, "onActivityDestroyed: ")
                val activityName = activity!!.localClassName
            }

            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
            }

            override fun onActivityStopped(activity: Activity?) {
            }

            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            }
        })
    }
}

AndroidManifest.xml

<application
            android:name=".MusicPlayerApplication"
....

我已经使用 logcat 测试了这种方法,我onDestory没有被调用,但是onActivityDestroyed每次我从 RAM 中杀死活动时都会调用回调,但是这个文档onActivityDestroyed当调用onDestory活动时会调用它,但这似乎没有发生. 但是,我发现这种方法比使用services更好。

于 2019-10-19T13:16:38.313 回答