1. App接收者注册
动态注册:手工执行代码去注册,
缺点:程序退出之后,接收者就不起作用了,就接收不到消息了。
静态注册:
在AndroidManifest.xml中添加如下:
<application> /*add: */ <receiver android:name=".MyBroadcastReceiver"> //“.类名”,当收到消息后其onReceive()被调用。 <intent-filter> <action android:name="android.intent.action.GLOBAL_BUTTON"/> </intent-filter> </receiver> </application>
我们的目的是按下一个键就能启动App,就需要接收者要常驻系统,因此需要静态注册。
2. 复写onReceive()
新建MyBroadcastReceiver.java:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Get BroadcastReceiver", Toast.LENGTH_SHORT).show(); /*启动当前组件*/ Intent intentNewTask = new Intent(context, MainActivity.class); intentNewTask.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intentNewTask); } }
3. 手工发广播给这个App测试
# am broadcast -a android.intent.action.GLOBAL_BUTTON -n com.example.mm.input_demo_01/.MyBroadcastReceiver
4. 实现按键发送广播给App
修改global_keys.xml文件内容如下:
<global_keys version="1"> <key keyCode="KEYCODE_TV" component="com.example.mm.input_demo_01/.MyBroadcastReceiver" /> </global_keys>
表示输入系统收到KEYCODE_TV时,向组件com.example.mm.input_demo_01的类MyBroadcastReceiver( MyBroadcastReceiver extends BroadcastReceiver)
发送消息,其重写的onReceive()被调用,在这函数中启动了本App.
将编译生成的新的framework-res.apk拷贝到开发板上:
# adb push ../../../../out/target/product/tiny4412/system/framework/framework-res.apk /system/framework/
5. 测试
若不使用特定于驱动名的.kl文件
# cat /system/usr/keylayout/Generic.kl | grep TV
key 377 TV
# insmod InputEmulator.ko
Linux内核上报扫描码337启动App
sendevent /dev/input/event5 1 377 1;
sendevent /dev/input/event5 1 377 0;
sendevent /dev/input/event5 0 0 0;
或直接使用input工具发送
# input keyevent TV //同样可以启动应用程序,注意这里input使用的是Android中的转换后的AKEYCODE_TV,不是Linux内核上报的扫描码。
6. am broadcast -a <ACTION>发送哪个类型的广播消息,-n <COMPONENT>发给谁。
7. am命令博客:https://blog.csdn.net/zuolongsnail/article/details/8167501
本文参考链接:https://www.cnblogs.com/hellokitty2/p/10884394.html