在安卓系统中如何模拟finishAffinity的功能?

3
问题非常明确。我正在进行一个类,以注册用户的活动以避免不活动,在2分钟没有任何活动或每次用户最小化应用程序后,应用程序应该关闭。我的代码如下所示:
public class InActivityTimer extends Activity {

    public static final long DISCONNECT_TIMEOUT = 2*60*1000; // 2 min = 2 * 60 * 1000 ms
    public static int ESTADO_ACTIVIDAD=0; //Variable para saber si la actividad está al frente o no.

    private static Handler disconnectHandler = new Handler(){
        public void handleMessage(Message msg) {
        }
    };

    private Runnable disconnectCallback = new Runnable() {
        @Override
        public void run() {
            // Perform any required operation on disconnect
            //finish();
            finishAffinity();
            Intent intent = new Intent(getApplicationContext(),VentanaInactividadCierreAplicacion.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

            //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
        }
    };

    public void resetDisconnectTimer(){
        disconnectHandler.removeCallbacks(disconnectCallback);
        disconnectHandler.postDelayed(disconnectCallback, DISCONNECT_TIMEOUT);
    }

    public void stopDisconnectTimer(){
        disconnectHandler.removeCallbacks(disconnectCallback);
    }

    @Override
    public void onUserInteraction(){
        resetDisconnectTimer();
    }

    @Override
    public void onResume() {
        super.onResume();
        ESTADO_ACTIVIDAD ++;
        resetDisconnectTimer();
        comprobarEstado();
    }

    private void comprobarEstado() {

        if (ESTADO_ACTIVIDAD == 0){
//            Intent startMain = new Intent(getApplicationContext(), SplashScreen.class);
//            startMain.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
//            startActivity(startMain);
//            finish();
            finishAffinity();
            Toast.makeText(getApplicationContext(), "RandomPassGEN cerrado por seguridad", Toast.LENGTH_SHORT).show();}
    }

    @Override
    public void onStop() {
        super.onStop();
        ESTADO_ACTIVIDAD--;
        stopDisconnectTimer();
        comprobarEstado();
    }

 /*   @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(getBaseContext(),"La aplicación se reiniciará por seguridad", Toast.LENGTH_SHORT).show();
        finishAffinity();
    }*/

}

从上面的代码可以看出,我使用了两次finishAffinity()方法。如果不使用该命令,有什么其他的替代方案吗?我想避免使用finishAffinity()方法,因为它需要Android +4.1版本。

非常感谢您的帮助。


你只想从任务中删除所有活动吗?你的活动是否在另一个应用程序的任务中运行? - David Wasser
不,他们不是。@DavidWasser - Razvi
1个回答

1
关闭您的应用程序,请执行以下操作:

Intent intent = new Intent(this, MyRootActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("exit", true);
startActivity(intent);

MyRootActivity 应该是您任务的根活动(在清单文件中具有ACTION=MAIN和CATEGORY=LAUNCHER)。

MyRootActivity.onCreate() 中,在 super.onCreate() 之后添加以下内容:

if (getIntent().hasExtra("exit")) {
    // User wants to exit, so do that
   finish();
   return;
}
... here is the rest of your onCreate() code

这只有在您的工作流下一个活动启动时,MyRootActivity 没有调用 finish() 才能正常工作。如果 MyRootActivity 在启动下一个活动时调用了 finish(),您应该更改它以使其不再这样做。在这种情况下,您需要将用户BACKs进入 MyRootActivity 视为特殊情况来处理。

@user1269737 为什么你要添加这个评论?这不是必需的。我不知道为什么你认为这是必须的。如果你有具体的问题,请创建一个新的问题。你的评论让人困惑。 - David Wasser
@user1269737 在这种情况下不需要。用户的应用程序已经在运行中。这不会导致将“启动”Intent存储为任务的根,并带有额外的“退出”信息。这里不需要进行检查,而且这样做会令人困惑。 - David Wasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接