Android:当我从最近的应用按钮关闭应用时,不会调用OnDestroy

时间:2017-01-19 14:58:00

标签: java android ondestroy close-application

当我们按下此按钮

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

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

4 个答案:

答案 0 :(得分:20)

如Android文档中所述,无法保证退出应用程序时会调用<ul class="whitBigIcons clearfix"> <li class=""> <a href="#"> <i class="mesa-icon"></i> <p class="mb0">Pagos, facturación y trámites administrativos</p> </a> </li>

  

&#34;在某些情况下,系统只会在不调用此方法的情况下终止活动的托管过程&#34;

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

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

创建服务类:

onDestroy()

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

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()以销毁服务之前,您可以运行关闭应用程序逻辑。

答案 1 :(得分:1)

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

请说明您想要实现的目标,并尝试提供更好的解决方案。

建议

所以,如果我理解你的话,我可以建议一件事。开始Service,每N秒触发一次LocalBroadcast(它对系统来说不是很重)。在BroadcastReceiver注册Activities广播。这样您就可以获得truefalse,具体取决于是否有任何BroadcastReceiver可以抓住您的LocalBroadcast。如果没有接收器,则检查是否有SharedPreferences值表示是否按下了Button

答案 2 :(得分:0)

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

1)创建一个扩展Application的类,然后通过在清单文件中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测试了这种方法,每次我从RAM杀死活动时,都不会调用我的onDestory,但是回调中的onActivityDestroyed会被调用,但是this doc说{调用某个活动的onActivityDestroyed时将调用{1}},但这似乎没有发生。但是,我发现这种方法比使用服务更好。

答案 3 :(得分:-4)

您的问题是onDestroy仅在Service中调用。在Activity中,被叫方法是onPause() 简单地将您的活动放在字段中:

@Override
public void onPause()
{
//Put your Code here
}