搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
秋刀鱼在做梦
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
OpenAI 称其在发布检测 ChatGPT 写作的工具时采取“审慎态度”
2
Linux给磁盘扩容(LVM方式)_lvm扩容
3
如何从零开始训练一个LLM大模型_ollama模型如何训练
4
(133)EMIF接口--->(005)基于FPGA实现EMIF接口
5
简单的 CSV 文件解析库_csv 解析库
6
史上最全低代码平台盘点!三分钟盘点2023年顶尖二十个低代码平台!
7
idea git回滚之前提交记录_idea git提交到本地的如何还原
8
Git的下载及GitHub基础使用!!!(含创建项目&提交文件)_github官网
9
群晖设置第三方套件以及安装Transmission_黑群晖 手动安装套件
10
活动:我的创作纪念日
当前位置:
article
> 正文
Android开关机源码分析
作者:秋刀鱼在做梦 | 2024-08-08 00:26:36
赞
踩
pojiavlauncher
2.1Android关机流程
Android关机流程的介绍网上很多,现在摘抄一段如下:
点击(
此处
)折叠或打开
关机动作从按键触发中断,linux kernel层给android framework层返回按键事件进入 framework层,再从 framework层到kernel层执行kernel层关机任务。
长按键对应的handler代码:
frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java
Runnable mPowerLongPress;
private final Runnable mPowerLongPress = new Runnable() {
public void run() {
if (!mPowerKeyHandled) {
mPowerKeyHandled = true;
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
showGlobalActionsDialog();
}
}
};
mPowerLongPress 启动关机对话框
(frameworks/policies/base/phone/com/android/internal/policy/impl/GlobalActions.java)
如果我们选择Power OFF’,
会调用 ShutdownThread.shutdown. 启动关机线程执行关机动作
。
frameworks/base/core/java/com/android/internal/app/ShutdownThread.java
真正关机 流程:
(1)广播全局事件, ACTION_SHUTDOWN Intent
(2)shutdown ActivityManager 服务
(3) 停止蓝牙服务
(4) 停止 电话服务 (radio phone service)
(5)停止mount 服务
(6) 调用 Power.shutdown() 进入native 层
frameworks/base/core/java/android/os/Power.java
power的native实现代码:
frameworks/base/core/jni/android_os_Power.cpp
static void android_os_Power_shutdown(JNIEnv *env, jobject clazz)
{
sync();
#ifdef HAVE_ANDROID_OS
reboot(RB_POWER_OFF);
#endif
}
sync, reboot 为linux系统调用,进入linux内核关机流程。
完毕。
仔细按照上面说的流程跟下去,确实是这样的,只不过根据产品的不同,会有一定的修改,例如产品是平板电脑,就会比手机少很多废话对话框,如果是智能电视,则又会有不同
,
对于这个任务来说,比较重要的ShutdownThread.java这个文件,这个文件启动了关机的对话框,关机对话框效果如图:
PhoneWindowManager中调用ShutdownThread的代码如下:
点击(
此处
)折叠或打开
mPowerKeyHandled
=
true
;
performHapticFeedbackLw
(
null
,
HapticFeedbackConstants
.
LONG_PRESS
,
false
)
;
sendCloseSystemWindows
(
SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS
)
;
ShutdownThread
.
shutdown
(
mContext
,
true
)
;
传入第一个参数不解释,第二个参数是是否显示对话框,true就是显示
。
2.2应用中关机的方法
凭借网络这个好老师,我找到了好几种实现关机的方法,一是通过向控制台写shutdown命令完成,Android是建立在Linux基础上的,所以这种方法需要Root。
二是启动ShutdownThread中的对话框,PhoneWindowManager直接通过一句
ShutdownThread
.
shutdown
(
mContext
,
true
)
;
就启动了,后面我也试过这种方法,确实可以启动,但是点击确定却一直关不了机。所以靠谱的方法还是通过Intent启动。方法如下
:
点击(
此处
)折叠或打开
Intent
shutdown
=
new
Intent
(
Intent
.
ACTION_REQUEST_SHUTDOWN
)
;
shutdown
.
putExtra
(
Intent
.
EXTRA_KEY_CONFIRM
,
true
)
;
shutdown
.
setFlags
(
Intent
.
FLAG_ACTIVITY_CLEAR_TOP
|
Intent
.
FLAG_ACTIVITY_NEW_TASK
)
;
startActivity(shutdown);
这上面的一些Flag值AndroidSDK中并没有公开,所以工程要放在Android源码中才能编译通过,除此之外还需要设置系统权限,需要通过修改AndroidManfast.xml文件实现。
2.3Appwidget的框架
个人感觉AppWidget像是嵌入launcher中的View,和AppWidget本身Activity的不是运行在同一个进程中,所以控制Appwidget都需要用RemoteViews控制。
桌面上有多个不同的AppWidget,如何得知哪一个被激活呢,这主要通过广播完成,广播发出的是在AndroidManfast.xml中定义好的android:name,接收时需要在OnReceive()方法中进行判断。
AndroidMainfast.xml摘录如下:
点击(
此处
)折叠或打开
<
receiver android:name
=
"AppWidget"
>
<
intent-filter
>
<
action
android:name
=
"android.appwidget.action.APPWIDGET_UPDATE"
>
<
/
action
>
<
/
intent-filter
>
<
meta-data android:name
=
"android.appwidget.provider"
android:resource
=
"@xml/appwidget01"
/
>
<
intent-filter
>
<
action android:name
=
"com.android.shutdownapp"
>
<
/
action
>
<
/
intent-filter
>
<
/
receiver
>
Appwidget的处理片段如下:
点击(
此处
)折叠或打开
@
Override
public
void
onReceive
(
Context
context
,
Intent intent
)
{
if
(
intent
.
getAction
(
)
.
equals
(
broadCastString
)
)
{
RemoteViews remoteViews
=
new
RemoteViews
(
context
.
getPackageName
(
)
,
R
.
layout
.
appwidgetlayout
)
;
remoteViews
.
setTextViewText
(
R
.
id
.
btnSend
,
"shutdown"
)
;
AppWidgetManager appWidgetManager
=
AppWidgetManager
.
getInstance
(
context
)
;
ComponentName componentName
=
new
ComponentName
(
context
,
AppWidget
.
class
)
;
appWidgetManager
.
updateAppWidget
(
componentName
,
remoteViews
)
;
}
super
.
onReceive
(
context
,
intent
)
;
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/945195
推荐阅读
article
Android
安全
攻防战
,
反编译
与混淆
技术
完全
解析(上)_
androd
反编译
有的
代码
无法阅读...
Android
安全
攻防战
,
反编译
与混淆
技术
完全
解析(上)之前一直有犹豫过要不要写这篇文章,毕竟去
反编译
人家的程序并不是什...
赞
踩
article
http
://www.
touch3g
.cn/
html
/
y2009
/using-
junit
-in-an...
这几天忙着写一个Android App(等完成以后应该会open source),今天差不多把网络相关的部分实现了,XM...
赞
踩
article
Android
Test
- 概览...
测试应用是应用开发过程中不可或缺的一部分。通过持续对应用运行测试,您可以在公开发布应用之前验证其正确性、功能行为和易用性...
赞
踩
article
Android
单元测试
-
运行
_
androidtest
如何执行...
运行
测试有多种方式:其中 1 和 2 实际上最终都是通过adb命令
运行
的,下面分别进行说明。使用IDE
运行
时,可以单个测...
赞
踩
article
Android
Termux
安装
MySQL
并实现
公网
远程
连接
本地
数据库
_安卓设备有没有
连接
数据库
的软...
本文介绍了如何在
Android
手机的
Termux
环境中安装和配置MariaDB,配合cpolar内网穿透工具,实现MyS...
赞
踩
article
Android
Termux
安装
MySQL
,并使用
cpolar
实现公网
安全
远程连接[内网穿透]_安卓...
Android
作为移动设备,尽管最初并非设计为服务器,但是随着技术的进步我们可以将
Android
配置为生产力工具,变成一...
赞
踩
article
Android
SurfaceFlinger
导读(04)
理解
BufferQueue
_
android
...
说明:关于导读:导读部分主要是方便初学者
理解
SurfaceFlinger
代码中的机制,为后面分析代码打下一个更好的基础,...
赞
踩
article
Android
SurfaceFlinger
——
概述
(
一
)...
对于系统渲染流程的理解是指导
SurfaceFlinger
设计的核心思想,从
Android
4.1
一
直到 Andr...
赞
踩
article
全面解读
Android
Graphics
图像显示
系统
_
android
图像
系统
...
全面解读
Android
Graphics
显示
系统
基础知识。_
android
图像
系统
android
图像
系统
...
赞
踩
article
Android
GUI之
SurfaceFlinger
_
android13
surfaceflinge...
Android
GUI之surfaceFlinger本文内容来源与网络文章目录
Android
GUI之surfaceFl...
赞
踩
article
Android
Studio
下载安装及完全卸载_
android
studio
卸载...
Android
Studio
是Google官方推荐的
Android
应用开发集成环境,它提供了集成的开发工具,支持Java...
赞
踩
article
/mnt/backup/
android
-
x86
_64-nougat-mptcp/
kernel
/arc...
/mnt/backup/
android
-
x86
_64-nougat-mptcp/
kernel
/
arch
/
x86
/conf...
赞
踩
article
OpenCV
入门
(六) ——
Android
下的
人脸识别
_
android
opencv
...
本篇我们来介绍在
Android
下如何实现
人脸识别
。上一篇我们介绍了如何在 Windows 下通过
OpenCV
实现...
赞
踩
article
Android
Studio
导入
jar
包或aar包_
android
studio
如何集成
jra
包...
Android
Studio
导入
jar
包或aar包_
android
studio
如何集成
jra
包
android
stu...
赞
踩
article
Android
studio
新版本
aar
包
导入
项目中
配置
_
android
studio
导入
aar
...
【代码】
Android
studio
新版本
aar
包
导入
项目中
配置
。_
android
studio
导入
aar
android
...
赞
踩
article
android
studio
生成
aar
包
并在其他
工程
引用
(导入)
aar
包
_
aar
引用
...
1.
aar
包
是Android
studio
下打
包
android
工程
中src、res、lib后
生成
的
aar
文件,
aar
包
导...
赞
踩
article
Android
Studio
模块打
aar
引入
aar
详细步骤_
androidstudio
引入
aar
...
android studio 生成
引入
aar
,jar._
androidstudio
引入
aar
包
androidstudio
...
赞
踩
article
android
studio
导入
aar
包_
android
studio
导入
aar
...
android
studio
导入
aar
包_
android
studio
导入
aar
android
studio
导入aa...
赞
踩
article
android
studio
添加
aar
包_
android
studio
引入
aar
...
按着以前旧的导包方式栽了大跟头,后面在留老板的的博客下找到了解决办法,记录一下。1.在新建libs目录,在app/lib...
赞
踩
article
Android
制作系统
签名
...
注意:基于AOSP源码制作的test key文件,一般无法使用在真实环境中(例如:手机),车载项目则较为复杂,有的项目在...
赞
踩
相关标签
android
Android
junit
HTML
TDD
Eclipse
单元测试
Espresso
自动化测试
gradle
数据库
mysql
安全
surfaceflinger
显示技术
SurfaceFlinger
android studio
android-studio
opencv
人工智能