Android 学习笔记 —— 统一管理 Activity 便于随时退出程序
- 统一管理 Activity 便于随时退出程序
- 统一管理 Activity
- 使用 Broadcast 实现强制下线功能
统一管理 Activity 便于随时退出程序
统一管理 Activity
-
创建 ActivityController 活动管理器类。
public class ActivityController {
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
activities.clear();
}
}
-
创建 BaseActivity 类并继承自 AppCompatActivity,重写 onCreate()
和 onDestroy()
方法。
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("BaseActivity", getClass().getSimpleName());
ActivityController.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityController.removeActivity(this);
}
}
-
最后别忘了修改 Activity 的父类,让它们都继承自 BaseActivity。
使用 Broadcast 实现强制下线功能
强制下线需要关闭所有 Activity,然后返回登录界面。前面已经实现了对 Activity 的同一管理,现在加入广播对其进行完善。
-
创建登录界面活动 LoginActivity,并让它继承自 BaseActivity,编写内部逻辑。
-
在对应 Activity 中定义发送自定义强制下线广播的方式。(以在 MainActivity 中点击按钮发送为例)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_send_force_offline_broadcast).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Warning")
.setMessage("You are forced to be offline. Please try to login again.")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent("com.amie.test.FORCE_OFFLINE");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
});
builder.show();
}
});
}
}
-
创建强制下线广播接收器类 ForceOfflineReceiver,并继承自 BroadcastReceiver,重写 onReceiver()
方法。
public class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ActivityController.finishAll();
context.startActivity(new Intent(context, LoginActivity.class));
}
}
-
完善 BaseActivity,重写 onResume()
和 onPause()
方法。
public class BaseActivity extends AppCompatActivity {
private final LocalBroadcastManager localBroadcastManager;
private ForceOfflineReceiver offlineReceiver;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) { }
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.amie.test.FORCE_OFFLINE");
offlineReceiver = new ForceOfflineReceiver();
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(offlineReceiver, intentFilter);
}
@Override
protected void onPause() {
super.onPause();
if (offlineReceiver != null) {
localBroadcastManager.unregisterReceiver(offlineReceiver);
offlineReceiver = null;
}
}
@Override
protected void onDestroy() { }
}
这里选择在 onResume()
和 onPause()
方法中注册和注销是因为强制下线广播只需要栈顶的 Activity 能接收到就可以了,非栈顶的 Activtiy 不需要也不应该去接收该广播。但这同样也有缺点,那就是会给每个 Activity 都注册广播接收器,并不是一个好的方案。