简介
在学习了《第一行代码》后,非常喜欢书中对活动的管理,用一个BaseActivity来管理活动,等同于添加一层来管理活动。
实现
通过新建继承自AppCompatActivity类的BaseActivity,来统一控制所有活动。在BaseActivity中对广播进行监听,从而实现对所有活动页面,广播监听以及统一的事件处理。
代码
代码主要分为三个模块,分别是对广播的注册监听、重写的广播接收器以及对活动中的广播注册与注销:
USBReceiver
这个类是继承自BroadcastReceiver ,广播接收器。主要是对事件的响应进行个性化处理,这里的类名要与配置文件中注册的名字相同:
public class USBReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.MEDIA_MOUNTED")) {//U盘插入
//事件处理
} else if (intent.getAction().equals("android.intent.action.MEDIA_UNMOUNTED")) {//U盘拔出
Toast.makeText(context, "外设存储拔出!", Toast.LENGTH_SHORT).show();
}else if (intent.getAction().equals("android.intent.action.MEDIA_REMOVED")){ // 完全拔出
//事件处理
}
}
}
注意:如果要获取文件路径,可以通过intent.getDataString();来获取。
AndroidManifest.xml
我比较喜欢叫这个为“配置文件”,在这里需要对广播类进行注册监听:
1、在<application>标签下,添加如下代码,实现对广播的注册。
2、<intent-filter> 标签对事件的过滤
3、<data android:scheme="file" /> 用来指明数据源类型
<receiver android:name=".USBReceiver">
<intent-filter>
<!-- 插入 -->
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<!-- 拔出 -->
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<!-- 完全拔出 -->
<action android:name="android.intent.action.MEDIA_REMOVED" />
<data android:scheme="file" />
</intent-filter>
</receiver>
ActivityController
这个类是《第一行代码》中说到的,可以复用的类,思路就是用一个数组来管理活动:
public class ActivityController {
public static List<Activity> activities = new ArrayList<Activity>();
private static Activity mCurrentActivity;
public static void addActivity(Activity activity) {
if (!activities.contains(activity)) {
activities.add(activity);
}
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void setCurrentActivity(Activity activity) {
mCurrentActivity = activity;
}
public static Activity getCurrentActivity() {
return mCurrentActivity;
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
public static void AppExit(Context context) {
try {
finishAll();
System.exit(0);
} catch (Exception e) {
System.out.println("退出应用异常!");
}
}
}
BaseActivity
这里是对活动的统一管理:
public class BaseActivity extends AppCompatActivity {
private USBReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityController.addActivity(this);
ActivityController.setCurrentActivity(this);
}
@Override
protected void onStart() {
receiver = new USBReceiver();
IntentFilter usbFilter= new IntentFilter();
usbFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
usbFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
usbFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
usbFilter.addDataScheme("file");
registerReceiver(receiver,usbFilter);
super.onStart();
}
@Override
protected void onStop() {
unregisterReceiver(receiver);
Log.i("base","注销USB广播");
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityController.removeActivity(this);
}
}
注意:需要在onStart中注册,在onStop中注销,原因请参考Android活动的生命周期。