在学习了《第一行代码》后,非常喜欢书中对活动的管理,用一个BaseActivity来管理活动,等同于添加一层来管理活动。
通过新建继承自AppCompatActivity类的BaseActivity,来统一控制所有活动。在BaseActivity中对广播进行监听,从而实现对所有活动页面,广播监听以及统一的事件处理。
代码主要分为三个模块,分别是对广播的注册监听、重写的广播接收器以及对活动中的广播注册与注销:
这个类是继承自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();来获取。
我比较喜欢叫这个为“配置文件”,在这里需要对广播类进行注册监听:
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>这个类是《第一行代码》中说到的,可以复用的类,思路就是用一个数组来管理活动:
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("退出应用异常!"); } } }这里是对活动的统一管理:
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活动的生命周期。