按键事件,自启动


遥控器功能的探索:

在 Android 中,处理按钮事件的组件通常包括以下几种:
活动(Activity):活动是 Android 应用程序中最基本的用户界面组件,可以接收和处理用户输入事件,例如按钮点击事件、触摸事件等。你可以在活动中重写相应的事件回调方法,例如 onClick() 方法来处理按钮点击事件。
对话框(Dialog):对话框是一种弹出式窗口,通常用于提示用户进行操作或显示一些信息。对话框也可以接收和处理按钮事件,例如确定按钮、取消按钮等。你可以在对话框中设置监听器来处理按钮点击事件。
列表项(List Item):列表项是一种常用的 UI 元素,通常用于显示列表数据。列表项也可以包含按钮控件,例如 CheckBox、RadioButton、Switch 等。你可以为列表项中的按钮设置监听器来处理按钮点击事件。
视图组(ViewGroup):视图组是一种容器控件,可以包含其他 UI 元素,例如按钮控件。你可以为视图组中的按钮设置监听器来处理按钮点击事件。
除了上述组件之外,还有一些其他的组件也可以处理按钮事件,例如菜单项(MenuItem)、通知栏(Notification)等。总之,在 Android 中,几乎所有的 UI 组件都可以处理按钮事件,只需要为相应的控件设置监听器即可。


那serive和broadcastreceiver可以处理按钮事件吗:
**Service 和 BroadcastReceiver 本身不能直接处理按钮事件**,它们主要用于在后台执行一些任务或接收系统级别的广播消息。
然而,你可以结合使用 Service 或 BroadcastReceiver 来处理按钮事件。具体来说:
Service:你可以在 Service 中监听按钮点击事件,并在事件发生时执行相应的逻辑。为了实现这一点,你可以在活动(Activity)中注册按钮点击事件的监听器,在监听器中启动 Service,并将按钮点击事件的相关信息传递给 Service 进行处理。
BroadcastReceiver:你可以在 BroadcastReceiver 中接收按钮点击事件的广播消息,并在接收到广播消息时执行相应的逻辑。为了实现这一点,你可以在活动中发送自定义的广播消息,然后在 BroadcastReceiver 中注册相应的广播过滤器,并在 onReceive() 方法中处理接收到的广播消息。
总结起来,虽然 Service 和 BroadcastReceiver 本身不能直接处理按钮事件,但你可以通过结合使用它们来处理按钮事件。你可以在 Service 或 BroadcastReceiver 中监听按钮点击事件的触发,并在事件发生时执行相应的逻辑。
(这种方式是一般的使用方式,正常的应用程序都是这样的,不过不是目前遇到问题的解决方案。)


假如activity不在当前页,但是应用程序在运行,可以触发在activity中的按钮事件吗
如果活动(Activity)不在当前页,但应用程序仍在运行,则无法直接触发该活动中的按钮事件。在 Android 应用中,按钮事件通常需要通过用户的交互来触发。
然而,你可以通过其他方式实现在活动中触发按钮事件的效果。一种常见的方法是使用广播接收者(BroadcastReceiver)。***你可以在活动中发送一个自定义的广播消息,并在活动以外的地方注册一个广播接收者来接收并处理该广播消息。这样,即使活动不在前台,你仍然可以通过发送广播来触发按钮事件的逻辑。***
***另一种方法是使用本地广播(LocalBroadcast)。本地广播只会在应用内部传递,不会被其他应用接收到。你可以在活动中发送本地广播,然后在其他组件中注册一个本地广播接收者来处理该广播。这样,即使活动不在当前页,你仍然可以通过发送本地广播来触发按钮事件的逻辑。***
总之,虽然无法直接触发活动中的按钮事件,但你可以通过发送广播或本地广播来间接触发活动中的按钮事件的逻辑。这样,即使活动不在当前页,你仍然能够在应用程序运行时处理按钮事件。


问:android系统的桌面程序会先接收到系统分发的按键事件吗?
Android 系统的桌面程序也可以注册按键事件的监听器,如果注册了监听器并且事件与监听器注册的按键匹配,那么桌面程序就能够接收到系统分发的按键事件。
在 Android 中,通过给窗口对象(Window)设置一个按键事件的回调函数(Callback)来监听按键事件。***当用户在设备上触发按键事件时,Android 系统会将该事件发送给当前活动的窗口对象,并调用该窗口对象的按键事件回调函数来处理该事件。***
如果当前活动的窗口对象是桌面程序的窗口,那么桌面程序就会先接收到系统分发的按键事件。如果当前活动的窗口对象不是桌面程序的窗口,则该事件会被发送给相应的窗口对象进行处理。
需要注意的是,如果多个窗口对象都注册了相同的按键事件回调函数,那么事件会按照特定的顺序分发给这些窗口对象进行处理。*这个顺序由窗口对象的类型、焦点状态等因素决定。*
总之,Android 系统的桌面程序可以接收到系统分发的按键事件,但是否先接收到取决于窗口对象的类型和焦点状态等因素。
*********
结论:那么也就是说谁占据当前焦点,谁就先获取到事件。**
--------------------------------------------------------
activity中确实可以处理按键事件(但是程序需要被点击启动),然后打开后台服务,后台服务打开其他app可以。     但是自启动的程序打开service然后打开app甚至打开activity都打不开。  原因是什么?

为什么必须要有前台界面?
二:service
目前结果:
在activity中跳转到到service是可以的,service中打开app也是可以的。(应用程序点击启动)
广播接收者中打开后台service/前台服务也是可以。(自启动)


验证:自启动
广播接收者直接启动app不可行。打开activity也不行。
不用点击应用程序那一种方式activity打开service。而自启动广播接受者打开service让service直接启动app是否可行。也不可行。
程序的服务虽然启动了,但是程序的activity并没有启动,点击运行程序后activity才会被创建。
###
好像在没有先启动一个activity时就无法打开另一个activity!!!!!

总结:
activity->service->activity 可以
broadcastreceiver->service可以
broadcastreceiver->service->activity不可以


按键事件的广播接受者能否打开service,(但是看不出来,所以必须要串口看日志),还有一点,当一个应用程序并没有打开时,即使触发了媒体按钮事件,该应用程序的广播接收者也无法接收到事件并进行处理。这是因为 BroadcastReceiver 是一种组件,它必须在运行中才能接收和处理广播。在设备刚开机时,除了系统自身的一些服务和应用外,其他应用程序的组件都还没有运行。因此,如果你想在设备开机后能够接收和处理媒体按钮事件的广播,你需要在应用程序中注册一个启动器(Boot Receiver),以便在设备启动完成后自动启动你的应用程序。
(所以其实直接自启动的程序, 只是启动了那个广播接受者,而其他的广播接收者呢???)

领导的方法屏蔽某些按键,不太可行。毕竟开机之后是桌面,事件早已经固定死了,某些按键是什么功能。也许是我不懂底层吧,反正认为不太可行。(待定,继续尝试)
我的方法是找到未定义按键事件的物理按键,这样系统层面就不会有相应的处理代码, 系统分发传递事件时就会被自己的应用程序接收并处理。应该是可行的。·结果是不可行。(也许是因为广播接收者没有启动)
试一下,自启动,按键事件的广播接收者到底启动与否!(怎么确定呢?在华为老板子上进行遥控测试,没有看到预期结果,也许是广播接受者没有启动,根本获取不到事件!)
在activity中注册广播接收者,也没有预期效果。
那么可以先打开service,在service中动态注册广播接收者,可以试试。  感觉没有什么毛病,还是没有预期效果。

在自启动广播接收器中注册按键事件广播接收器,也可以试试。

再试试换一种service。


***在Android中,框架层(Framework)收到HAL层(Hardware Abstraction Layer)传递的事件后,通常会将这些事件进行处理,然后再将它们以广播的形式传递给应用程序。这是通过Android的事件分发机制实现的。****
当用户在设备上执行某个操作(如点击屏幕、按下按键等),HAL层会接收到底层硬件的事件。然后,HAL层将这些事件传递给框架层。在框架层,事件会被处理,并根据当前的应用程序焦点和活动状态进行分发。
****如果应用程序具有焦点并且正在前台运行,框架层会将事件传递给应用程序的活动(Activity)。如果应用程序没有焦点或者在后台运行,框架层会将事件以广播的形式发送给应用程序。****
应用程序可以通过注册相应的广播接收器(Broadcast Receiver)来接收这些事件广播。通过注册适当的广播接收器并处理接收到的广播,应用程序可以对用户操作做出响应。
**需要注意的是,框架层并不是将所有的事件都以广播的形式传递给应用程序,而是根据事件的类型和应用程序的状态进行选择性的传递。例如,屏幕触摸事件通常会直接传递给应用程序的活动,而不是以广播形式传递。***
总结起来,框架层在收到HAL层传递的事件后,会根据应用程序的状态选择性地将事件以广播的形式传递给应用程序。应用程序可以通过注册广播接收器来接收这些事件广播,并做出相应的响应。


那么也就是说,框架层事件一定是可以接收的,接收到后,自启动程序没有获得焦点,所以并不会直接将事件传递给应用程序的活动,因为根本就没有活动。那么就只能以广播的形式进行传递。所以可以启动一个服务(或者直接再注册一个广播接收者),注册一个处理按键事件的广播接收者。
###启动前台服务,在电视中又不弹窗。就算弹窗也需要用户再次点击才能跳转。(可以在服务中再次创建一个广播接收者啊,然后一旦触发系统事件,就进行处理)

如果你想在Android系统的框架层截取输入事件并直接启动其他应用程序,你需要进行一些系统级别的修改。这涉及到修改Android系统的源代码,并重新构建系统映像。以下是一个大致的步骤:
1. 下载并构建Android源代码:首先,你需要从Android开源项目中下载Android源代码,并按照官方文档的指导进行构建。这将生成一个可部署的Android系统映像。
2. 修改框架层代码:在Android源代码中,你需要找到处理输入事件的相关代码,并进行修改。具体来说,你需要找到事件分发的代码,通常位于`frameworks/base/core/java/android/view/ViewRootImpl.java`文件中。在这里,你可以截取输入事件并根据你的需求启动其他应用程序。
3. 重新构建系统映像:完成代码修改后,你需要重新构建整个Android系统映像。按照官方文档的指导,使用构建工具将修改后的源代码编译为系统映像。
4. 刷入修改后的系统映像:将构建好的系统映像刷入目标设备中。这需要设备具有解锁的引导加载程序(bootloader)和适当的刷机工具。
需要注意的是,修改Android系统的源代码是一项复杂的任务,并且需要对Android系统的架构和代码非常熟悉。此外,修改后的系统映像可能无法通过官方的系统更新机制进行更新,并且可能会导致设备不稳定或无法正常工作。
如果你只是想在应用程序中接收按键事件并启动其他应用程序,而不进行系统级别的修改,你可以尝试以下方法:
1. 在应用程序中注册广播接收器,监听指定的广播。可以使用`LocalBroadcastManager`来注册本地广播接收器。
2. 在框架层捕获到对应的按键事件后,通过发送广播的方式将事件信息传递给应用程序。
3. 应用程序的广播接收器接收到广播后,根据接收到的事件信息启动其他应用程序。
这种方法不需要对Android系统进行修改,但需要确保应用程序在后台运行时不被杀死,以便能够接收到广播。你可以考虑使用前台服务或者使用`JobScheduler`来保持应用程序在后台运行。
需要注意的是,Android系统对广播的限制是为了提高系统的安全性和性能。在进行任何系统级别的修改之前,请确保充分了解相关的安全风险,并对系统进行适当的测试和验证。


猜测:领导也许是想开机后就显示欢迎界面,然后将界面就隐藏,成为后台服务,开始接收按键事件。
但是呢,第一,事件根本不需要后台服务,直接广播接收者就好了啊。
剩下的就好办了,我先验证在桌面能否显示一个欢迎界面,然后关掉。
实际:领导想要的:
程序自启动,把桌面应用程序打开。
然后在后台运行过程中可以获取到按键事件,并且将按键事件给前台桌面应用程序进行处理。     当按到指定的按键时,直接把播放视频的软件打开。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值