Java 在应用程序关闭之前,我如何执行某些操作?

Java 在应用程序关闭之前,我如何执行某些操作?,java,android,tcp,ondestroy,application-close,Java,Android,Tcp,Ondestroy,Application Close,我在安卓系统中制作了一个应用程序,其中我有一个TCP客户端,但现在我只想在应用程序即将关闭时向服务器发送消息,我正在尝试添加openConnection(打开与TCP客户端的连接)和sendMessage(向TCP服务器发送消息)onDestroy方法中的操作,但无效。 我使用的TCP客户端就在这里,实际上我需要向服务器发送此消息,告知与设备的通信已关闭,并发送消息“设备处于脱机状态”,然后关闭应用程序。以下方法调用diff action 使用主页按钮-->此调用最小化应用程序 onPause

我在安卓系统中制作了一个应用程序,其中我有一个TCP客户端,但现在我只想在应用程序即将关闭时向服务器发送消息,我正在尝试添加
openConnection
(打开与TCP客户端的连接)和
sendMessage
(向TCP服务器发送消息)onDestroy方法中的操作,但无效。
我使用的TCP客户端就在这里,实际上我需要向服务器发送此消息,告知与设备的通信已关闭,并发送消息“设备处于脱机状态”,然后关闭应用程序。

以下方法调用diff action

  • 使用主页按钮-->此调用最小化应用程序

    onPause() 顶部()

  • 从任务管理器中删除应用->

    然后为该MainActivity(启动器)调用onDestroy()

因此,假设一个名为BaseActivity的父活动,并重写它的 onPause()、onDestroy()和onStop()方法,并调用 从这里开始实施,然后从您的 其他活动


您不应该依赖onDestroy方法。根据android官方文档,它并不总是被调用

尝试将相同的代码放在活动的onStop()方法中

此外,您还可以拥有一个由所有其他活动扩展的父活动


然后,您可以覆盖特定子活动中的onPause()和onStop()方法,并处理特定场景。

方法1:您可以使用ActivityLifecycleCallbacks来实现此目的。下面是一个带有一些日志的示例

public class MyApplication extends Application {

    private static final String TAG = MyApplication.class.getSimpleName();
    private int mVisibleCount;
    private boolean mInBackground;

    @Override public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            }

            @Override public void onActivityStarted(Activity activity) {
                mVisibleCount++;
                if (mInBackground && mVisibleCount > 0) {
                    mInBackground = false;
                    Log.i(TAG, "App in foreground");
                }
            }

            @Override public void onActivityResumed(Activity activity) {
            }

            @Override public void onActivityPaused(Activity activity) {
            }

            @Override public void onActivityStopped(Activity activity) {
                mVisibleCount--;
                if (mVisibleCount == 0) {
                    if (activity.isFinishing()) {
                        Log.i(TAG, "App is finishing");
                    } else {
                        mInBackground = true;
                        Log.i(TAG, "App in background");
                    }
                }
            }

            @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override public void onActivityDestroyed(Activity activity) {
            }
        });
    }

    public boolean isAppInBackground() {
        return mInBackground;
    }

    public boolean isAppVisible() {
        return mVisibleCount > 0;
    }

    public int getVisibleCount() {
        return mVisibleCount;
    }
}

方法2:还有一种方法使用服务来检测应用程序是否终止。请参见

我必须在MainActivity中实现它,还是创建一个新类?我怎样才能从主要活动中唤起它呢?我认为你在任何活动中都做不到这一点。您应该真正创建一个应用程序类,在我使用所有这些创建了一个新类之后,我如何在MainActivity中调用它?在您创建应用程序类之后,您应该在清单文件中设置应用程序名称,请参见。您不需要调用MainActivity中的任何内容。在这里做你的工作。更好地理解应用程序类see看起来很有用,因为我可以看到日志“App in background”,但当我从任务中关闭它时,没有日志“App is finishing”。。。我应该在我的应用程序中的何处实现messageSend操作?尝试在开始时创建一个服务,然后在调用
onDestroy
时向该服务发送广播,即使应用程序宕机,服务仍将保留…如果用户关闭手机,这可能不起作用…@MarceloFilho实际上我正在尝试使用它,但我只成功再次启动TCP客户端,因为它关闭应用程序太快,无法同时发送消息。