android 退出机制

简介:

android sdk 退出机制的研究 有多种,

方法一、用list保存activity实例,然后逐一干掉

上代码:


import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Application;
import android.content.DialogInterface;
import android.content.Intent;

public class SysApplication extends Application {
    private List<Activity> mList = new LinkedList<Activity>();
    private static SysApplication instance;

    private SysApplication() {  
    }

    public synchronized static SysApplication getInstance() {
        if (null == instance) {
            instance = new SysApplication();
        }
        return instance;
    }

    // add Activity 
    public void addActivity(Activity activity) {
        mList.add(activity);
    }

    public void exit() {
        try {
            for (Activity activity : mList) {
                if (activity != null)
                    activity.finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.exit(0);
        }
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();    
        System.gc();
    }

}

在每个Activity的onCreate方法中添加类似代码:


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    SysApplication.getInstance().addActivity(this);
}
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState); 
  SysApplication.getInstance().addActivity(this);
}

在需要退出程序的时候,调用:


SysApplication.getInstance().exit();
SysApplication.getInstance().exit();

简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity 的finish方法

方法二、使用广播


ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
manager.killBackgroundProcesses(package);

不行


android.os.Process.killProcess(android.os.Process.myPid());

也不行


manager.restartPackage(package);

还是不行


Intent MyIntent = new Intent(Intent.ACTION_MAIN);
MyIntent.addCategory(Intent.CATEGORY_HOME);
startActivity(MyIntent);
finish();

这个只是退回到桌面,如果打开多个Activity关闭重新打开也会有问题,还是还是不行

看到有说广播机制,发现是个好东东,能彻底解决这个问题,废话不说看代码:


public abstract class EnterActivity extends BaseActivity {
...
    // 写一个广播的内部类,当收到动作时,结束activity
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            unregisterReceiver(this); // 这句话必须要写要不会报错,不写虽然能关闭,会报一堆错
            ((Activity) context).finish();
        }
    };

    @Override
    public void onResume() {
        super.onResume();

        // 在当前的activity中注册广播
        IntentFilter filter = new IntentFilter();
        filter.addAction(Attribute.PAGENAME);
        registerReceiver(this.broadcastReceiver, filter); // 注册
    }

    /**
     * 关闭
     */
    public void close() {
        Intent intent = new Intent();
        intent.setAction(Attribute.PAGENAME); // 说明动作
        sendBroadcast(intent);// 该函数用于发送广播
        finish();
    }
...
}

这就是 我对android中的activity的退出机制的总结.

在以后的教程中,我们将一步步实现这样的效果.


目录
相关文章
“framework必会”系列:Android Input系统(一)事件读取机制
曾经在开发的很长一段时间内,笔者对点击事件的认知只存在于自定义View中的`onTouchEvent`等方法的处理。 后来慢慢的接触到`Android的事件分发机制`,但也只是在**Activity->ViewGroup->View**层面的分发逻辑
|
4月前
|
Android开发 容器
[Android]View的事件分发机制(源码解析)
[Android]View的事件分发机制(源码解析)
36 0
|
4月前
|
消息中间件 缓存 安全
android开发,使用kotlin学习消息机制Handler
android开发,使用kotlin学习消息机制Handler
78 0
|
4月前
|
安全 Android开发 Kotlin
android开发,使用kotlin学习Android权限机制
android开发,使用kotlin学习Android权限机制
35 0
|
8月前
|
Android开发
Android 使用Alarm机制创建长时间在后台运行的定时任务
Android 使用Alarm机制创建长时间在后台运行的定时任务
158 0
|
8月前
|
Java API Android开发
Android 权限机制详解
Android 权限机制详解
72 0
|
8月前
|
XML 消息中间件 API
Android 中handler消息机制的理解
Android 中handler消息机制的理解
46 0
|
12月前
|
调度 Android开发
Android异步消息处理机制之Handler、Looper、Message
因为Android UI线程是线程不安全的,在子线程中更新UI会直接程序崩溃,另外当UI线程需要执行一个比较耗时的操作的话(IO操作,网络通信等),若是执行时间超过5s,程序会直接ANR,为了解决上述问题,可以使用异步消息处理机制[Handler]
|
设计模式 前端开发 Java
Android体系课之--Kotlin协程进阶篇-协程的异常处理机制以及suspend关键字(三)
协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器!)上调度执行,而代码则保持如同顺序执行一样简单。
|
缓存 Android开发 UED
一文读懂系列Android屏幕刷新机制
对一些大中型项目来说可能就不一样了:**他们涉及业务较多,设备种类较多,往往一个app内部集成了十几个子业务甚至上百个,这对应用性能要求就更加严格了,app的体验也会间接导致用户的留存问题**。 所以学习屏幕绘制这类理论性较强的知识也是非常有必要的。