Android ICS关机跟重新启动功能研究

Android ICS关机跟重新启动功能研究

 

         最近研究了一下android关机跟重新启动功能。网上的文章也不少,做法也有一些。笔者试过了几种方法,下面介绍一下:

  <一>、 Android重启功能

          在androidjava层执行shell命令来完成。但是笔者在开发测试中同样的代码发现用Eng编译出的版本可以重新启动,user版本不能完成重启,挂在关机那个界面。

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/sundesheng125原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

      

       用shell命令,eng版本能完成重新启动的代码如下:

String cmd = "su -c reboot";
exeShell(cmd);

   public void exeShell(String cmd){         

            try{
                 Process p = Runtime.getRuntime().exec(cmd);
                 BufferedReader in = new BufferedReader(
                                     new InputStreamReader(
                               p.getInputStream()));
                 String line = null;
                 while ((line = in.readLine()) != null) {
                    Log.i("exeShell",line);
                 }    

            }
            catch(Throwable t)
             {
                  t.printStackTrace();
             }  

}

       提示的错误是权限问题,但是代码是一样的,manifest里面也给了REBOOT权限,在网上找了一下解释还是没有什么好的解决方案,错误信息如下:

01-01 08:05:26.319 W/System.err(  776): java.io.IOException: Error running exec(). Command: [su, -c, reboot] Working Directory: null Environment: null
01-01 08:05:26.319 W/System.err(  776): 	at java.lang.ProcessManager.exec(ProcessManager.java:211)
01-01 08:05:26.319 W/System.err(  776): 	at java.lang.Runtime.exec(Runtime.java:168)
01-01 08:05:26.319 W/System.err(  776): 	at java.lang.Runtime.exec(Runtime.java:241)
01-01 08:05:26.319 W/System.err(  776): 	at java.lang.Runtime.exec(Runtime.java:184)
01-01 08:05:26.319 W/System.err(  776): 	at com.android.settings.DevelopmentSettings.exeShell(DevelopmentSettings.java:591)
01-01 08:05:26.319 W/System.err(  776): 	at com.android.settings.DevelopmentSettings.onPreferenceChange(DevelopmentSettings.java:580)
01-01 08:05:26.319 W/System.err(  776): 	at android.preference.Preference.callChangeListener(Preference.java:885)
01-01 08:05:26.319 W/System.err(  776): 	at android.preference.ListPreference.onDialogClosed(ListPreference.java:265)
01-01 08:05:26.329 W/System.err(  776): 	at android.preference.DialogPreference.onDismiss(DialogPreference.java:381)
01-01 08:05:26.329 W/System.err(  776): 	at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1235)
01-01 08:05:26.329 W/System.err(  776): 	at android.os.Handler.dispatchMessage(Handler.java:99)
01-01 08:05:26.329 W/System.err(  776): 	at android.os.Looper.loop(Looper.java:137)
01-01 08:05:26.329 W/System.err(  776): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
01-01 08:05:26.329 W/System.err(  776): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-01 08:05:26.329 W/System.err(  776): 	at java.lang.reflect.Method.invoke(Method.java:511)
01-01 08:05:26.329 W/System.err(  776): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-01 08:05:26.329 W/System.err(  776): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-01 08:05:26.329 W/System.err(  776): 	at dalvik.system.NativeStart.main(Native Method)
01-01 08:05:26.329 W/System.err(  776): Caused by: java.io.IOException: Permission denied
01-01 08:05:26.329 W/System.err(  776): 	at java.lang.ProcessManager.exec(Native Method)
01-01 08:05:26.339 W/System.err(  776): 	at java.lang.ProcessManager.exec(ProcessManager.java:209)
01-01 08:05:26.339 W/System.err(  776): 	... 17 more
01-01 08:05:26.369 W/InputManagerService(  174): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4138ecb8

    

      另外网上还有一种做法,代码如下:

Intent i = new Intent(Intent.ACTION_REBOOT);

  i.putExtra("nowait", 1);
  i.putExtra("interval", 1);
  i.putExtra("window", 0);
  sendBroadcast(i);

     不过这种要做签名,比较麻烦,笔者没有试过。

 

       笔者后面又在framework下面找了一下相关功能得代码,在

./frameworks/base/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java文件中有一个新的方法,模仿这个方法,笔者完成了既能在eng版本,也能在user版本中完成重新启动的程序。具体代码如下:

  Intent iReboot = new Intent(Intent.ACTION_REBOOT);
                iReboot.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                mContext.startActivity(iReboot);               

 

<二>、关机功能:

        关机功能相对来说更容易些,应该不够android的手机还是平板,长按电源都会弹出一个关机的对话框,模仿一下相应的代码就可以实现,在framework下面也有一个shutdown的一块处理模块。关机的具体代码如下:

                Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);

                shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, false);

                shutdown.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                mContext.startActivity(shutdown);

 

<三>、关于context

   
笔者的关机或重启功能是在:【setting】--》【开发人员选项】里面增加了一项【关闭车载平板电脑】,在DevelopmentSettings.java中,这里面不是普通的activitie,是一个PreferenceFragment,所以要得到context,需要使用如下方法:

        mContext = getActivity();

      不能使用getContext();view有getContext的方法,fragment有getActivity的方法,activity就是context的子类,context不一定是activity,但是activity一定是context,总之,程序一定要找到上下文,否则intent什么的,都不可以操作。

 

         一些功能得开发,很多能在android源码里找到类似功能得代码,在framework下面有一下test代码,也很有用,搜索一下总能找到一些解决办法。

 

 

时间: 2024-12-27 03:48:13

Android ICS关机跟重新启动功能研究的相关文章

Android实现关机与重启的几种方式(推荐)_Android

下面我们来探究Android如何实现关机,重启:在Android中这种操作往往需要管理员级别,或者root Android实现的方式如下几种: 默认的SDK并没有提供应用开发者直接的Android系统关机或重启的API接口,一般来讲,实现Android系统的关机或重启,需要较高的权限(系统权限甚至Root权限).所以,在一般的APP中,如果想要实现关机或重启功能,要么是在App中声明系统权限,要么是通过某种"间接"的方式,比如广播或反射,来间接实现系统关机或重启.再者,就是放在源码环境

Android实现关机与重启的几种方式(推荐)

下面我们来探究Android如何实现关机,重启:在Android中这种操作往往需要管理员级别,或者root Android实现的方式如下几种: 默认的SDK并没有提供应用开发者直接的Android系统关机或重启的API接口,一般来讲,实现Android系统的关机或重启,需要较高的权限(系统权限甚至Root权限).所以,在一般的APP中,如果想要实现关机或重启功能,要么是在App中声明系统权限,要么是通过某种"间接"的方式,比如广播或反射,来间接实现系统关机或重启.再者,就是放在源码环境

求android中一个定时提醒功能的实现思路!

问题描述 求android中一个定时提醒功能的实现思路! 比如在一个记事本中,我写了一项任务,想加一个定时提醒功能,类似闹钟一样,但又和闹钟不一样,闹钟只能定今天的时间,我想定任意一天的任意时刻的一个提醒功能,跪求实现思路!!! 解决方案 http://blog.csdn.net/wanglang3081/article/details/7456684 解决方案二: 这一个service在后台运行,实时检查时间 解决方案三: Timer定时机制. 解决方案四: 如果要实现任意天任意时刻,那就必须

Android 百度地图POI搜索功能实例代码_Android

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

Android 百度地图POI搜索功能实例代码

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

Android模拟强制下线通知功能实例代码

package com.itheima74.broadcastbestpractice; import android.content.Intent; import android.os.Bundle; import android.os.SystemClock; import android.support.v4.content.LocalBroadcastManager; import android.view.View; /** * 模拟强制下线通知 * 1.登录成功后10秒发送一条本地自

急急急解决掉割了-android 模拟back键的功能

问题描述 android 模拟back键的功能 android 页面放置一个button ,想button点击的时候 实现和手机back键一样的效果..急!!!!急!!!! 解决方案 试试 onBackPressed();

VB.NET实现关机和重新启动

Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Integer, ByVal dwReserved As Integer) As Integer Const EWX_FORCE As Short = 4 Const EWX_LOGOFF As Short = 0 Const EWX_REBOOT As Short = 2 Const EWX_SHUTDOWN As Short = 1 Dim re

android 印象笔记的拍照裁剪功能是如何实现的

问题描述 android 印象笔记的拍照裁剪功能是如何实现的 50C 图片说明图片说明](http://img.ask.csdn.net/upload/201605/16/1463397579_244523.jpg) 他是后台算法进行的裁剪,用的什么技术呢??很急,跪求了! 解决方案 解决方案二: 一.概述拍照以及裁剪功能在有些项目中还是经常能遇到的,一般而言,使用拍照和裁剪功能基本上都是使用系统自带的Intent来实现,看起来很简单,但是其中还是有一些问题需要注意的.二.基本知识讲解先看看拍照