本帖最后由 gz_boy 于 2010-04-23 15:22:29 编辑

解决方案 »

  1.   


    //重启代码位于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
    }static void android_os_Power_reboot(JNIEnv *env, jobject clazz, jstring reason)
    {/*重启*/
        sync();
    #ifdef HAVE_ANDROID_OS
        if (reason == NULL) {
            reboot(RB_AUTOBOOT);
        } else {
            const char *chars = env->GetStringUTFChars(reason, NULL);
            __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
                     LINUX_REBOOT_CMD_RESTART2, (char*) chars);
            env->ReleaseStringUTFChars(reason, chars);  // In case it fails.
        }
        jniThrowIOException(env, errno);
    #endif
    }
    try it.
      

  2.   

    谢谢大家都关注。To wiki14:
    http://topic.csdn.net/u/20091116/08/090c5315-d941-484b-9447-6a11c4b43945.html的帖子中echo007 网友回复了这段信息:看问题要看本质,任何系统级应用都会到linux的系统调用中去, 对于reboot来讲,会调用到int reboot (int mode) 或者直接用 __reboot来做, 所以你只要change mode的值就ok, mode 里有
    #define RB_AUTOBOOT LINUX_REBOOT_CMD_RESTART
    #define RB_HALT_SYSTEM LINUX_REBOOT_CMD_HALT
    #define RB_ENABLE_CAD LINUX_REBOOT_CMD_CAD_ON
    #define RB_DISABLE_CAD LINUX_REBOOT_CMD_CAD_OFF
    #define RB_POWER_OFF LINUX_REBOOT_CMD_POWER_OFF这些可以选择,power off , autoboot 对应的就是开关机了。 当然您需要root或者system的权限,或者SHELL好像也没问题。
    重新查看了下SDK,关于Intent.ACTION_REBOOT , ACTION_SHUTDOWN 的描述:public static final String ACTION_REBOOT
    Since: API Level 1Broadcast Action: Have the device reboot. This is only for use by system code.This is a protected intent that can only be sent by the system.
    Constant Value: "android.intent.action.REBOOT"public static final String ACTION_SHUTDOWN
    Since: API Level 4Broadcast Action: Device is shutting down. This is broadcast when the device is being shut down (completely turned off, not sleeping). Once the broadcast is complete, the final shutdown will proceed and all unsaved data lost. Apps will not normally need to handle this, since the foreground activity will be paused as well.This is a protected intent that can only be sent by the system.
    Constant Value: "android.intent.action.ACTION_SHUTDOWN"感觉通过 wiki14 提供的源码中关于关机重启实现的机制和在 Android 中直接使用 Intent  的效果是一样的。
    装NDK老出问题,没搞定,wiki14可否帮忙试下上面的代码看行否,当然搞定了后也会试下,有结果再贴出来。附:原帖中疏漏的地方:需在Android.mk中添加这条语句:
    LOCAL_CERTIFICATE := platform
      

  3.   

    To shichexixi ,你好,我直接采用的是用源码编译的,你可以根据提供的文件去查看源代码中GOOGLE是怎么调用关机重启的,更深入的理解就要参考wiki14 帖子中提到的代码了。注意添加权限。关机:
    In frameworks/base/services/java/com/android/server/BatteryService.javaIntent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);            intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            mContext.startActivity(intent);重启:
    Intent i = new Intent(Intent.ACTION_REBOOT);
    i.putExtra("nowait", 1);
    i.putExtra("interval", 1);
    i.putExtra("window", 0);
    sendBroadcast(i);
    谢谢各位的热心解答。
      

  4.   

    请问gz_boy,以上“关机”和“重启”功能执行是都需要什么权限?
    我是说 除了在Android.mk中添加LOCAL_CERTIFICATE := platform,以及在AndroidManifest.xml文件中指定android:sharedUserId="android.uid.system"之外,还需要其它的权限吗?我看你在本贴的开头提供的代码中引入了android.permission.RECEIVE_BOOT_COMPLETED权限,但该权限仅仅会使APP能够接收到系统引导成功(即启动完成)的广播而已,似乎与关机和重启没有关系。
      

  5.   

    不好意思,贴漏了
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...
          android:sharedUserId="android.uid.system"
          >
        <uses-permission android:name="android.permission.SHUTDOWN"/>
      

  6.   

    android:sharedUserId这个值是用来干什么的呢
      

  7.   

    主要是权限的问题。google或者baidu之,
    习惯的话直接去查doc也OK,Permissions里面会有解释
      

  8.   

    关机:
    In frameworks/base/services/java/com/android/server/BatteryService.javaIntent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);  intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  mContext.startActivity(intent);重启:
    Intent i = new Intent(Intent.ACTION_REBOOT);
    i.putExtra("nowait", 1);
    i.putExtra("interval", 1);
    i.putExtra("window", 0);
    sendBroadcast(i); 放在app里面Intent.ACTION_REQUEST_SHUTDOWN压根就找不到,求解!
      

  9.   

    To lujl1988:
      放在app里面Intent.ACTION_REQUEST_SHUTDOWN压根就找不到,求解!  你好,帖子中的“找不到”是指IDE报错吗,不知道是不是这个意思?
      过的太久了都不太记的了,建议你可以尝试先查下reference doc,看能不能找到,找不到;然后可以去找找源码,有,也就是说不是公开的。So,IDE会报错,但是可以和系统源码一起编译.好运,另提前祝端午快乐。
      

  10.   

    系统源码一起编译后,可以在其他机子上运行吗?怎么放在app文件怎么跟系统源码一起编译啊?
      

  11.   

    问题1:当时的实验环境是在譬如2.1源码下编译,生成的文件成功在2.1的环境下运行
    问题2:app怎么在系统源码环境下编译?
    11年,即使中文资料,网上应该很多,建议类似如此的关键词“android app 在源码中编译”google下。好运!
      

  12.   


    我不知道我的理解有没有问题
    我把他们直接放在了onCreat里,应该就是关机或者重新启动了吧。
    权限也加了。
    但是为什么我程序连运行都运行不了
    加了这句“android:sharedUserId="android.uid.system"”以后就不行了。。在console中提示INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,请问是什么原因
      

  13.   

    to Etzmico:
    是使用eclipse编译然后console端显示"INSTALL_FAILED_SHARED_USER_INCOMPATIBLE"吗?
    这里牵涉到签名的知识,
    search下“android:sharedUserId="android.uid.system,应该会有所收获的
    我之前是通过扔进源码里编译解决的,你也可以尝试使用其他的方式解决这个问题
      

  14.   

    嗯呢,我也是,用linux系统mm出的,成功了,在windows下用eclipse直接生成apk就不行。
    我搜索了,都是用linux弄的,请问你知道windows下怎么弄么……就是直接能用eclipse相关的……
      

  15.   

    重启:
    Intent i = new Intent(Intent.ACTION_REBOOT);
    i.putExtra("nowait", 1);
    i.putExtra("interval", 1);
    i.putExtra("window", 0);
    sendBroadcast(i);  
    请问上述代码中三组键值的意思是什么
      

  16.   

    很高兴最近也是调这个问题,开始我把此代码加到 LUANCHER2 里,编译过了,担是 用不了关机这个功能 一点它,程序就报错了。楼主不知道还在关注这个问题不。我有个问题。长按关机键,用的代码就是ShutdownThread.Shutdown 。我在用时,发现点了确定,它就出现一个关机画面,担是就是关不了机,不晓得是为撒。请教呀!
      

  17.   

    你用的虚拟机否?
    虚拟机是关机不了的
    另外你是在什么平台下编译的?win?
      

  18.   

    我的报错了,为什么加进哪个权限虚拟机运行不起来,而且没有Intent.ACTION_REQUEST_SHUTDOWN这个,
      

  19.   

    第一步,下载android源码
    第二步,编译android源码,SDK.
    第三步,在windows下或linux下编写自己的工程。
    第四步,在 /out/packages/app/ 下建立自己的工程文件夹,将你自己的工程中的src,res,Admainfest.xml三个,拷贝到第三步建立的工程文件夹。
    第五步,忘记了,我现在没在公司。记不清楚命令了。明天再写了。 
      

  20.   

    求可关闭android手机的代码,求可运行demo,qq:395928533。在线等,急求,十分感谢啊。
      

  21.   


    你好,当初公司用的是windriver系统,包括驱动在内的乱七八糟的东西都有人在写,所以你懂得,不是从网上下载的。实际上只是提供大家一个思路,可以通过调用底层的源代码来实现此功能,因为稍微牵涉到一点系统编译的知识,如果只了解过应用的朋友可能比较陌生。忘记关贴了,印象中我看见的最早的一个关机程序是国外的某个老大写的开源项目,不过需要root权限才能运行,有兴趣可以去搜索下。看了下,国内其实实现这个功能并在线发布的软件已经不少了。
      

  22.   

    Intent.ACTION_RUN  是干吗用的阿    有哪位知道 怎么进入到某一个正在运行服务的相关信息界面??
      

  23.   

        /**
         * Set to true in {@link #ACTION_REQUEST_SHUTDOWN} to request confirmation from the user
         * before shutting down.
         *
         * {@hide}
         */
        public static final String EXTRA_KEY_CONFIRM = "android.intent.extra.KEY_CONFIRM";
      

  24.   

     /**
         * Activity Action:  Start this activity to request system shutdown.
         * The optional boolean extra field {@link #EXTRA_KEY_CONFIRM} can be set to true
         * to request confirmation from the user before shutting down.
         *
         * <p class="note">This is a protected intent that can only be sent
         * by the system.
         *
         * {@hide}
         */
        public static final String ACTION_REQUEST_SHUTDOWN = "android.intent.action.ACTION_REQUEST_SHUTDOWN";
        /**
      

  25.   

    急啊,开发环境好了后,都有系统源码的吗?
    系统源码要另外下?
    请问你知道windows下怎么弄么?
    怎么放在app文件怎么跟系统源码一起编译啊?
      

  26.   

    怎么放在app文件怎么跟系统源码一起编译啊?
      

  27.   

     mContext.startActivity(intent);   启动哪个关机界面啊?、