• Android输入系统(5)——一键启动App测试


    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

  • 相关阅读:
    leetcode -- Add Binary
    leetcode -- 4sum
    leecode -- 3sum Closet
    C++单例模式
    MapReduce的模式、算法和用例
    react 学习笔记
    css3 文字过长用...代替
    scss/css 中添加ie hack
    springmvc 解决跨域CORS
    springmvc 添加Junit4
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10884394.html
Copyright © 2020-2023  润新知