Android 通过广播来实现外设插拔检测

简介

在学习了《第一行代码》后,非常喜欢书中对活动的管理,用一个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活动的生命周期。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值