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: null01-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 denied01-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 more01-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()viewgetContext的方法,fragmentgetActivity的方法,activity就是context的子类,context不一定是activity,但是activity一定是context,总之,程序一定要找到上下文,否则intent什么的,都不可以操作。

 

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


 

 

更多相关文章

  1. android EditText设置不可写
  2. android 使用html5作布局文件: webview跟javascript交互
  3. android studio调试c/c++代码
  4. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  5. 锁屏界面
  6. android(NDK+JNI)---Eclipse+CDT+gdb调试android ndk程序
  7. [Android(安卓)NDK]Android(安卓)JNI开发例子 ---3 在JNI中实现o
  8. Android(安卓)version and Linux Kernel version
  9. Android(安卓)闹钟管理类的使用

随机推荐

  1. Android 怎样击败 iPhone ?
  2. Android(安卓)Studio 集成JPUSH推送
  3. 仿网易新闻效果源码分析
  4. 使用Tortoise SVN版本控制Android项目in
  5. 【android】两类不能在SDK中使用的API---
  6. Android(安卓)自定义PopupWindow实现的Me
  7. Android 将取代 Linux 成为面向物联网的
  8. Android中如何使用ViewPager实现类似lauc
  9. android实现简单音乐播放器
  10. 【项目】Android(安卓)预置第三方应用可