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

简介: Android ICS关机跟重新启动功能研究            最近研究了一下android关机跟重新启动功能。网上的文章也不少,做法也有一些。

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

 

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


 

 

目录
相关文章
|
5月前
|
Android开发
Android Launcher研究(二)-----------Launcher为何物,究竟是干什么
Android Launcher研究(二)-----------Launcher为何物,究竟是干什么
92 2
|
2月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
89 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
8天前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
5月前
|
Android开发
定制Android关机界面
定制Android关机界面
67 0
|
2月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
4月前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
178 2
|
4月前
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
84 3
|
5月前
|
移动开发 监控 Android开发
构建高效Android应用:从内存优化到电池寿命代码之美:从功能实现到艺术创作
【5月更文挑战第28天】 在移动开发领域,特别是针对Android系统,性能优化始终是关键议题之一。本文深入探讨了如何通过细致的内存管理和电池使用策略,提升Android应用的运行效率和用户体验。文章不仅涵盖了现代Android设备上常见的内存泄漏问题,还提出了有效的解决方案,包括代码级优化和使用工具进行诊断。同时,文中也详细阐述了如何通过减少不必要的后台服务、合理管理设备唤醒锁以及优化网络调用等手段延长应用的电池续航时间。这些方法和技术旨在帮助开发者构建更加健壮、高效的Android应用程序。
|
5月前
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
171 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
4月前
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
107 0
下一篇
无影云桌面