如何安全退出已调用多个Activity的Application?

在开发自己的android程序时,经常会遇到一个问题,就是在启动多个Activity的情况下,如果要退出应用回到桌面,可能要按多次后退键,这是由Android系统默认的启动模式所决定的,在默认情况下,Android系统会为每一个新打开的Activity创建一个实例。这将带来很不好的用户体验,在面试的时候我们也经常会被问到这个问题,那么该如何解决呢?本文给大家推荐一种非常好用的方法,也是使用最多的。

这种方法的原理就是把每一个新建的Activity都加入到列表中,然后在重写Activity的onBackPressed()方法,在该方法中将列表中的数据移除。下面通过一个实例进行解释:

在MainActivity中我只添加了一个按钮,通过该按钮可以启动SecondActivity,在SecondActivity中同样添加了一个按钮,通过该按钮可以启动MainActivity。布局代码比较简单,就不贴出了。我自定义了一个MyApplication,继承自Application,在该类中,定义了一个列表,类型为Activity,同时定义了一个exit()方法,用来退出Activity,代码如下:

public class MyApplication extends Application {
    public List<Activity> list = new ArrayList<>();
    public void exit(){
        for(Activity a:list){
            a.finish();
        }
        list.clear();
    }
}
注意,自定义的Application必须要在ManiFest文件中进行声明后方可使用:

<application
    android:name=".MyApplication"
    ....>
MainActivity.java代码如下:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyApplication application = (MyApplication) getApplication();
        application.list.add(this);
        findViewById(R.id.main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });
    }

    @Override
    public void onBackPressed() {
        MyApplication application = (MyApplication) getApplication();
        application.exit();
        super.onBackPressed();
    }
}
SecondActivity中的代码与此类似:

public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        MyApplication application = (MyApplication) getApplication();
        application.list.add(this);
        findViewById(R.id.second).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(SecondActivity.this,MainActivity.class));
            }
        });
    }

    @Override
    public void onBackPressed() {
        MyApplication application = (MyApplication) getApplication();
        application.exit();
        super.onBackPressed();

    }
}

然后运行程序,无论打开多少个新的Activity,只要使用后退键即可直接退出程序。

有些应用使用点击两次返回键退出程序,这个只要监听两次返回键,计算出两次之间的差值即可,可以定义一个差值常量,若小于该常量,将Activity退出,否则不做任何处理。大家可以自己试一下,在这就不列出了。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Service中调用Activity中的Handler对象可以通过以下步骤实现: 1. 在Activity中定义Handler对象。 2. 在Service中使用Messenger来与Activity通信。Messenger是一种轻量级的IPC方式,可用于不同进程间的通信。 3. 在Service中创建一个Messenger对象,并将Activity中定义的Handler对象传递给Messenger。 4. 在Activity中通过bindService()方法绑定Service,并将Activity中定义的Handler对象传递给Service。 5. 在Service中使用Messenger向Activity发送消息,Activity中的Handler对象将接收并处理消息。 下面是一个简单的示例代码: 在Activity中定义Handler对象: ``` private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // 处理消息 } }; ``` 在Service中创建Messenger对象,并将Activity中定义的Handler对象传递给Messenger: ``` private Messenger mMessenger = new Messenger(new Handler() { @Override public void handleMessage(Message msg) { // 接收Activity发送的消息 } }); ``` 在Activity中通过bindService()方法绑定Service,并将Activity中定义的Handler对象传递给Service: ``` Intent intent = new Intent(this, MyService.class); intent.putExtra("handler", mHandler); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); ``` 在Service中向Activity发送消息: ``` Message msg = Message.obtain(); msg.what = 1; mMessenger.send(msg); ``` 在Activity中的Handler对象将接收并处理消息: ``` @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: // 处理消息 break; default: super.handleMessage(msg); break; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值