当前位置: 移动技术网 > IT编程>移动开发>Android > Android编程实现系统重启与关机的方法

Android编程实现系统重启与关机的方法

2019年07月24日  | 移动技术网IT编程  | 我要评论

青年文摘投稿邮箱,民国异梦 书书网,福气又安康优酷

本文实例讲述了android编程实现系统重启与关机的方法。分享给大家供大家参考,具体如下:

最近在做个东西,巧合碰到了shareduserid 的问题,所以收集了一些资料,存存档备份。

安装在设备中的每一个apk文件,android 给每个 apk 进程分配一个单独的用户空间,其 manifest 中的 userid 就是对应一个 linux 用户都会被分配到一个属于自己的统一的 linux 用户 id,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。

用户 id 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

通过 shared user id 拥有同一个user id的多个apk可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程,同时可以访问其他apk的数据目录下的数据库和文件.就像访问本程序的数据一样.
对于一个 apk 来说,如果要使用某个共享 uid 的话,必须做三步:

1、在 manifest 节点中增加 android:shareduserid 属性。

2、在 android.mk 中增加 local_certificate 的定义。

如果增加了上面的属性但没有定义与之对应的 local_certificate 的话,apk是安装不上去的。

提示错误是:

package com.test.mytest has no signatures that match those in shared user android.uid.system; ignoring!

也就是说,仅有相同签名和相同 shareduserid 标签的两个应用程序签名都会被分配相同的用户id。

例如所有和 media/download 相关的 apk 都使用 android.media 作为 shareduserid 的话,那么它们必须有相同的签名 media。

3、把 apk 的源码放到 packages/apps/ 目录下,用 mm 进行编译。

举例说明一下。

系统中所有使用android.uid.system作为共享uid的apk,都会首先在manifest节点中增加:

android:shareduserid="android.uid.system"

然后在 android.mk 中增加

local_certificate := platform

可以参见settings等。

系统中所有使用 android.uid.shared 作为共享 uid 的 apk,都会在 manifest 节点中增加

android:shareduserid="android.uid.shared"

然后在 android.mk 中增加

local_certificate := shared

可以参见launcher等

系统中所有使用 android.media 作为共享 uid 的 apk,都会在 manifest 节点中增加

android:shareduserid="android.media"

然后在 android.mk 中增加

local_certificate := media

可以参见gallery等。

另外,应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。

当通过 getsharedpreferences(string,int)、openfileoutput(string、int)或者 openorcreate database(string、int、sqlitedatabase.cursorfactory)

创建一个新文件时,开发者可以同时或分别使用mode_world_readable 和mode_world_riteable 标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他任何应用程序可以看到它。

关于签名

build/target/product/security 目录中有四组默认签名供 android.mk 在编译apk使用:

1、testkey:  普通 apk,默认情况下使用。

2、platform:该 apk 完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的 apk 所在进程的 uid 为 system。

3、shared:   该apk需要和home/contacts进程共享数据。

4、media:该apk是media/download系统中的一环。

应用程序的 android.mk 中有一个 local_certificate 字段,由它指定用哪个 key 签名,未指定的默认用 testkey
 
在应用层如何通过代码实现 android 系统的重启,分享给大家。

这篇文章是在 android 系统开发的基础之上进行实践的,所以如果你是纯粹的 app 开发,可能要让你失望了。

该代码在真机上测试成功,在模拟器上面测试失败。

在 linux 下面,重启 pc,非 root 用户需要执行 sudo reboot,所以在 android 下重启机器也需要一定的权限。

应用程序界面:
 
1. 新建一个 android 工程 reboot
 
2. 编写 android.mk

local_path:= $(call my-dir)
include $(clear_vars)
local_module_tags := optional
local_src_files := $(call all-java-files-under, src)
local_package_name := reboot
local_certificate := platform
include $(build_package)
# use the folloing include to make our test apk.
include $(call all-makefiles-under,$(local_path))

具体含义可自行查阅资料。注意:

local_certificate := platform

3. 编写补充 androidmenifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="mark.zhang"
  android:versioncode="1"
  android:versionname="1.0" >
<uses-sdk android:minsdkversion="7" />
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:shareduserid="android.uid.system" >
<activity
      android:label="@string/app_name"
      android:name=".rebootactivity" >
      <intent-filter >
        <action android:name="android.intent.action.main" />
        <category android:name="android.intent.category.launcher" />
      </intent-filter>
    </activity>
</application>
</manifest>

注意:

android:shareduserid="android.uid.system"

4. 编写逻辑代码 rebootactivity.java

package mark.zhang;
import android.app.activity;
import android.content.intent;
import android.os.bundle;
import android.view.view;
public class rebootactivity extends activity {
  // 是否显示关机确认的对话框
  // false 不显示确认关机的对话框,直接关机
  // true 显示确认关机的对话框,让用户选择是否确认关机
  public static final boolean showshutdowndialog = false;
@override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
  }
/**
   * 发送广播.
   *
   * @param view
   */
  public void onreboot(view view)
  {
    intent reboot = new intent(intent.action_reboot);
    reboot.putextra("nowait", 1);
    reboot.putextra("interval", 1);
    reboot.putextra("window", 0);
    sendbroadcast(reboot);
  }
/**
   * 启动 activity.
   *
   * @param view
   */
  public void onshutdown(view view)
  {
    public void onshutdown(view view)
   {
    intent shutdown = new intent(intent.action_request_shutdown);
    shutdown.putextra(intent.extra_key_confirm, showshutdowndialog);
    shutdown.setflags(intent.flag_activity_clear_top | intent.flag_activity_new_task);
    startactivity(shutdown);
   }
  }
}

注意:

intent.action_request_shutdown
intent.extra_key_confirm

会报错,这是因为该属性是  {@hide} 的。
不要担心放到系统编译就可以了,注意下面的步骤即可。

5. 将整个工程放到 android 源码里面编译

a. 手动复制 reboot 到 src/packages/app 下面

b. mm -j4 开始编译(可以参考 《android入门之源码开发基础教程》)

如果编译成功,在 /out/target/product/generic/system/app 目录下面,会多一个 reboot.apk 文件。

6. 安装 apk

该 apk 必须放到 system/app 下面,即 adb push reboot.apk /system/app

思考

关机或者重启,一个是发送广播,一个是启动 activity。
通过查找相应的 action 或者 string 资源(如关机关键字)就可以找到对应的类。
我们知道,framwork 的 mk 文件、资源文件等都在:
/frameworks/base/core/res、frameworks/base/core/res/res
比如关机的那个 activity 就是 shutdownactiviy,其又调用 shutdownthread.shutdown。
重启的相关的类在 watchdog.java(定义了相关的量), 其内部类 rebootrequestreceiver 是主要代码。
继续追踪你就会了解整个流程了。

更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android多媒体操作技巧汇总(音频,视频,录音等)》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网