源码分析相关面试题
- Volley源码分析
- 注解框架实现原理
- okhttp3.0源码分析
- onSaveInstanceState源码分析
Activity相关面试题
- 保存Activity的状态
- activity的启动模式原理(一)
- activity的启动模式原理(二)
- activity的启动模式原理(三)
- ActivityRecord TaskRecord和ProcessRecord之间的关系
- service里面startActivity抛异常?activity不会
- 如何退出Activity?如何安全退出已调用多个Activity的Application?
Service相关面试题
- IntentService源码分析
- Service是否在main thread中执行, service里面是否能执行耗时的操作
- service被kill之后怎么让它重启
与XMPP相关面试题
- 与XMPP相关试题一
- 与XMPP相关试题二
与性能优化相关面试题
- 与性能优化相关面试题一
- 与性能优化相关面试题二
- 与性能优化相关面试题三
- 与性能优化相关面试题四
- 与性能优化相关面试题五
- 与性能优化相关面试题六
- 与IPC机制相关面试题
与登录相关面试题
- oauth认证协议原理
- token产生的意义
- 微信扫一扫实现原理
与开发相关面试题
- 迭代开发的时候如何向前兼容新旧接口
- 手把手教你如何解决as jar包冲突
- context的原理分析
- 解决ViewPager.setCurrentItem中间很多页面切换方案
- 创建虚拟机时报错 Please file a bug against Android Studio
- 字体适配
- 键盘弹起挡住输入框
- 机型适配之痛,例如三星、小米、华为、魅族等
与人事相关面试题
- 人事面试宝典
一 容器式:
建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activity
public class BaseActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState ) {
super.onCreate(savedInstanceState);
ActivityManager.getActivityManager().addActivity(this);
}
@Override protected void onDestroy() {
super.onDestroy();
// 结束Activity&从栈中移除该Activity
ActivityManager.getActivityManager().finishActivity();
}
}
public class ActivityManager {
// Activity栈
private static Stack<Activity> activityStack;
// 单例模式
private static ActivityManager instance;
private ActivityManager() {
}
/**
* 单一实例
*/
public static ActivityManager getActivityManager() {
if (instance == null) {
instance = new ActivityManager();
}
return instance;
}
/**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
/**
* 获取当前Activity(堆栈中最后一个压入的)
*/
public Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}
/**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
Activity activity = activityStack.lastElement();
finishActivity(activity);
}
/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 结束指定类名的Activity
*/
public void finishActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
}
}
}
/**
* 结束所有Activity
*/
public void finishAllActivity() {
for (int i = 0; i < activityStack.size(); i++) {
if (null != activityStack.get(i)) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/**
* 退出应用程序
*/
public void AppExit(Context context) {
try {
finishAllActivity();
//根据进程ID,杀死该进程
android.os.Process.killProcess(android.os.Process.myPid());
//退出真个应用程序
System.exit(0);
} catch (Exception e) {
}
}
}
二、广播式
通过在BaseActivity中注册一个广播,当退出时发送一个广播,finish退出
public class BaseActivity2 extends AppCompatActivity {
private static final String EXITACTION = "action.exit";
private ExitReceiver exitReceiver = new ExitReceiver();
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter filter = new IntentFilter();
filter.addAction(EXITACTION);
registerReceiver(exitReceiver, filter);
}
@Override protected void onDestroy() {
super.onDestroy(); unregisterReceiver(exitReceiver);
}
class ExitReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
BaseActivity2.this.finish();
}
}
}
三 RxBus优雅式
首先,在基类BaseActivity里,注册RxBus监听:
public class BaseActivity3 extends AppCompatActivity {
Subscription mSubscription;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initRxBus();
}
//接收退出的指令,关闭所有activity
private void initRxBus() {
mSubscription = RxBus.getInstance().toObserverable(NormalEvent.class)
.subscribe(new Action1<NormalEvent>() {
@Override
public void call(NormalEvent userEvent) {
if (userEvent.getType() == -1) {
finish();
}
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (!mSubscription.isUnsubscribed()) {
mSubscription.unsubscribe();
}
}
}
这是事件实体NormalEvent:
public class NormalEvent {
private int type;
public NormalEvent(int type) {
this.type = type;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
新建RxBus类
public class RxBus {
private static volatile RxBus mInstance;
private final Subject bus;
public RxBus()
{
bus = new SerializedSubject<>(PublishSubject.create());
}
/**
* 单例模式RxBus
*
* @return
*/
public static RxBus getInstance()
{
RxBus rxBus2 = mInstance;
if (mInstance == null)
{
synchronized (RxBus.class)
{
rxBus2 = mInstance;
if (mInstance == null)
{
rxBus2 = new RxBus();
mInstance = rxBus2;
}
}
}
return rxBus2;
}
/**
* 发送消息
*
* @param object
*/
public void post(Object object)
{
bus.onNext(object);
}
/**
* 接收消息
*
* @param eventType
* @param <T>
* @return
*/
public <T> Observable<T> toObserverable(Class<T> eventType)
{
return bus.ofType(eventType);
}
}
最后,在需要退出的地方调用:
RxBus.getInstance().post(new NormalEvent(-1));//发送退出指令
四:SingleTask
1、设置MainActivity的加载模式为singleTask
android:launchMode="singleTask"
2、将退出出口放置在MainActivity
private boolean mIsExit;
@Override /** * 双击返回键退出 */
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (mIsExit) {
this.finish();
} else {
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
mIsExit = true;
new Handler().postDelayed(new Runnable() {
@Override public void run() {
mIsExit = false;
}
}, 2000);
} return true;
} return super.onKeyDown(keyCode, event);
}
五、SingleTask改版式
第一步设置MainActivity的加载模式为singleTask
android:launchMode="singleTask"
第二步重写onNewIntent()方法
private static final String TAG_EXIT = "exit";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {
boolean isExit = intent.getBooleanExtra(TAG_EXIT, false);
if (isExit) { this.finish();
}
}
}
第三步 退出
Intent intent = new Intent(this,MainActivity.class); intent.putExtra(MainActivity.TAG_EXIT, true); startActivity(intent);
- 欢迎关注微信公众号,长期推荐技术文章和技术视频
- 微信公众号名称:Android干货程序员