一旦焦点丢失,如何杀死应用程序?

时间:2012-07-30 21:25:41

标签: android android-activity process background focus

我正在尝试让我的应用程序的主要活动完成(不是在后台保持活动应用程序),同时保持服务的进程处于活动状态。

如果用户按下主页按钮并离开我的应用程序或从我的应用程序外部启动其他活动,我希望活动关闭,而不是列为活动应用程序。

然而,重要的是,这个过程仍然存在。我不希望我的后台服务也死掉。

这样做最好的方法是什么?

3 个答案:

答案 0 :(得分:0)

您不应该强行关闭应用程序,因为系统在处理此问题时表现良好。相反,你应该调用finish()来表示应用程序已经完成并可以处理(你的服务将继续运行)。

答案 1 :(得分:0)

默认情况下Services没有用户界面。一旦开始,它们一直运行直到它们崩溃或被杀死。用户可以关闭您的应用并启动新应用,服务将保持不变。

另一方面,

Activities仅在可见时才会运行。当用户导航到另一个活动时,之前的活动为paused, stopped, or killed

执行上面简要描述的操作的一种简单方法是创建一个启动服务的Activity。这样,当使用导航离开您的活动时,服务将继续在后台运行。

如果您希望自己的活动在新视图进入视图时完全死亡,只需在finish()onPause()方法中为您的活动拨打onStop()(这可能更多)适合您的应用)。

答案 2 :(得分:0)

您应该创建一个Application类。像这样:

public class AvaApplication extends Application {
    private static boolean FOCUSED = true;

    public static boolean isAppFocused() {
        Log.v("@@@@@@  isAppFocused", "called");
        return FOCUSED;
    }  

    public static void appResumed() {
        Log.v("@@@@@@  appResumed", "called");
        FOCUSED = true;
    }

    public static void appPaused() {
        Log.v("@@@@@@  appPaused", "called");
        FOCUSED = false;
    }  
}
在您的AdroidManifest.xml中

将此行添加到您的Application标记:

android:name="your.package.name.MyApplication"

在每个活动中写下这个:

@Override
protected void onPause() {
    super.onPause();
    MyApplication.appPaused();
}

@Override
protected void onResume() {
    super.onResume();
    MyApplication.appResumed();
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus)  
    {  
        //do something if you want
    } else {
        Thread.sleep(100);
        if(!MyApplication.isAppFocused){

             finish();
             return();
         }
    }
}

默认情况下,后台服务应继续运行,但您也可以使用START_STICKY。在您的服务中:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //do your stuff in the service

    return Service.START_STICKY;
}