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);
-
}
分享到:
相关推荐
在Android系统中,定时开关机功能是通过修改framework层的代码来实现的。这个功能对于设备管理和自动化...通过分析和修改这些源码,开发者不仅可以实现自定义的定时开关机功能,还能提升对Android系统底层机制的理解。
在Android系统中,实现自动开关机功能涉及到对操作系统底层机制的理解以及权限的控制。这个"Android 自动开关机实现 源码"很可能是提供了一种解决方案,让我们深入探讨一下这个话题。 首先,我们要知道在Android...
本知识库将深入解析"Android应用源码之自动开关机实现.zip"压缩包中的源码,帮助你理解如何在Android平台上创建这样一个功能。 首先,我们要明白在Android系统中,只有系统级别的应用或者拥有ROOT权限的应用才能...
在Android系统中,实现自动开关机涉及到多个层次的技术,包括系统服务、权限管理以及与硬件...如果你手头有这个"Android自动开关机实现"的源码,那么你可以通过分析和学习这些代码,更具体地了解每个步骤的实现细节。
10. **源码分析**:提供的"Android自动开关机实现.doc"文档很可能是对源码的解释和使用指南,通过阅读文档,开发者可以更深入地理解实现原理和步骤,以及如何在实际项目中应用。 总的来说,实现Android自动开关机...
在安卓(Android)系统中,实现自动开关机功能涉及到对操作系统底层的深度理解和代码修改。这一功能并非在标准的Android开放源代码项目(AOSP)中直接提供,但可以通过自定义ROM或者系统服务来实现。以下是对这个...
下面我们将深入探讨如何利用Android源码实现自动开关机。 1. **Android内核与定时启动** - 安卓系统基于Linux内核,因此实现自动开机需要对Linux的定时器和系统启动流程有深入了解。 - Linux内核中的`RTC`(实时...
Android自动开关机实现.rar Android视频采集+RTSP完整代码(可用) Android远程登录含有loading登录效.zip Angle v1.0_2D游戏引擎.ZIP BOOK看遍所有UI控件.7z BrewClock闹钟.zip BTAndroidWebViewSelection(webview...
9. **Android程序研发源码Android自动开关机实现.rar**: 实现设备自动开关机涉及到系统级的编程,这部分源码可以帮助开发者理解Android系统的底层工作原理。 10. **Android程序研发源码FiveChess五子棋.zip**: ...
MTK6577+Android 之关机电流高问题的解决 本文将详细介绍 MTK6577+Android 之关机电流高问题的解决方法。该问题在关机时电流仍然很高,达到了 25mA,...* Android 关机流程的源码分析 * MTK 快速开机技术的原理和实现
例如,在Android系统中,开关机动画的更改可能涉及到修改`system/core/init`目录下的启动脚本,或修改`frameworks/base/core/java/android/view/WindowManagerService.java`等文件,以及相应的XML配置文件。...
Android自动开关机实现.rar Android远程登录含有loading登录效.zip Angle v1.0_2D游戏引擎.ZIP BOOK看遍所有UI控件.7z BrewClock闹钟.zip cellmap v2.0 基站查询定位导航系统 .rar DialogShow.rar dialog去除边框...
通过学习和分析这个"Android多线程断点下载源码",开发者不仅可以掌握多线程下载和断点续传的核心技术,还能深入了解Android系统的文件IO、线程管理、网络请求等重要知识,对提升Android应用开发技能有着显著的帮助...
在IT领域,"pc控制电脑源码"是一个有趣且实用的技术实现,允许用户通过手机远程对个人计算机(PC)进行操作,如开..."手机控制电脑"的源码分析和实践,对于学习网络通信、操作系统接口以及跨平台开发具有很高的价值。
- **开关机及待机**: - **配置短按和长按遥控器power键行为**:设置不同按键时长的功能。 - **待机(休眠唤醒)**:如何配置待机状态。 - **配置出厂时的默认launcher**:设定系统启动时默认打开的launcher。 - **...
`detect_memory.sh`脚本可能就是一个用于监控和分析Android设备内存使用情况的工具。通常,它会包含如下步骤: 1. 连接设备:使用`adb devices`确认设备已连接,并通过`adb shell`进入设备的命令行环境。 2. 获取...
源码分析: 1. **视频流处理**:大华SDK中的视频流处理模块可能包括了视频编码、解码、传输等功能。开发者可以通过调用相关的API来获取实时视频流,进行显示或者存储。编码部分可能涉及到H.264、H.265等高效编码...
- **标题栏和操作按钮**:使用RelativeLayout布局,标题居中,开关机和刷新按钮分别置于左侧和右侧。 - **评分控件**:这是一个自定义控件,将在后面详细讨论,用于显示净水机水质评分。 - **冲洗按钮**:通过Button...