Android 断开电源5秒后自动关机

最近在做行车记录仪的事情,由于车载设备上的锂电池容量比较小,所以在停车熄火,保存数据后需要自动关机,由于Shutdown的权限不对普通应用开放,所以需要在源码下编译代码。可以自己写个BroadcastReceiver放到Setting源码里,也可以是独立应用。

manifest节点需要声明系统级uid:

android:sharedUserId="android.uid.system"

以及关机权限:

<uses-permission android:name="android.permission.SHUTDOWN"/>

以上这两点在Setting的AndroidManifest里都有,所以就不用我们手动添加了。

然后我在Application里声明了两个全局变量,用来存储当前的电源状态和已经断开电源的秒数:


    /**
     * 电源是否连接
     */
    public static boolean isPowerConnect = true;

    /**
     * 电源断开的秒数
     */
    public static int OffSecond = 0;

接着就是PowerStateChangeReceiver:

package com.android.settings;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

public class PowerStateChangeReceiver extends BroadcastReceiver {

    private Context context;

    @Override
    public void onReceive(Context context, Intent intent) {

        this.context = context;

        if ("android.intent.action.ACTION_POWER_CONNECTED".equals(intent
                .getAction())) {
            Screenshot.isPowerConnect = true;
            //Toast.makeText(context, "CONNECTED", Toast.LENGTH_SHORT).show();
        } else if ("android.intent.action.ACTION_POWER_DISCONNECTED"
                .equals(intent.getAction())) {
            Screenshot.isPowerConnect = false;
            //Toast.makeText(context, "DISCONNECTED", Toast.LENGTH_SHORT).show();
            new Thread(new shutdownThread()).start();
        }
    }

    /**
     * Shutdown
     *
     * @param context
     */
    public void shutdown(Context context) {
        try {
            Intent intent = new Intent(
                    "android.intent.action.ACTION_REQUEST_SHUTDOWN");

            intent.putExtra("android.intent.extra.KEY_CONFIRM", false);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        } catch (Exception e) {
        }
        Toast.makeText(context, context.getResources().getString(R.string.shutdown_now), Toast.LENGTH_SHORT).show();
    }

    public class shutdownThread implements Runnable {

        @Override
        public void run() {
            while (true) {

                try {
                    Thread.sleep(1000);
                    Message message = new Message();
                    message.what = 1;
                    shutdownHandler.sendMessage(message);
                    if (!Screenshot.isPowerConnect) {
                        Screenshot.OffSecond++;
                    } else {
                        Screenshot.OffSecond = 0;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    final Handler shutdownHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                if (Screenshot.OffSecond == 5
                        && !Screenshot.isPowerConnect) {
                    shutdown(context);
                }
                break;

            default:
                break;
            }
        }
    };

}

另外是在setting的AndroidManifest.xml对reveiver的声明:

<receiver android:name=".PowerStateChangeReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>

okay,大功告成。

版权声明:本文原创,转载请注明出处:http://blog.csdn.net/zhoumushui

时间: 2024-07-29 09:40:00

Android 断开电源5秒后自动关机的相关文章

android 页面停几秒后跳转

<span style="white-space:pre">      </span>//实现等待几秒后跳转,方法一 new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(MainActivity.this, ExampleActivity.class); startActivity(intent); } }, SPL

Android几秒后自动关闭dialog

代码改变世界 Android几秒后自动关闭dialog AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); builder.setTitle("发送成功!"); builder.setMessage("2秒后自动关闭!"); builder.setCancelable(true); final AlertDialog dlg = builder.create(); dlg.sh

Android实现点击通知栏后,先启动应用再打开目标Activity

情况简述 在开发Android app的过程中,遇到这样一个需求:app中启动一个Service,该Service在独立进程中运行,与服务器保持长连接,将服务器推送过来的消息在通知栏中显示,并设置点击动作,点击后跳转到app中对应的Activity.目前遇到的问题是Service以独立进程运行,在收到消息并弹出通知后,app本身的进程有两种情况: app正在运行 app已退出 对于第一种情况,处理就非常简单了,直接将参数传入Intent并打开对应的Activity即可. 但第二种情况比较复杂,因

Android实现点击通知栏后,先启动应用再打开目标Activity ,极光推送等推送的也可以参考一下(转)

我因为项目中集成了极光推送,推送的通知栏点开需要确定进入哪个界面就参考了这边文章,感谢作者的无私. 情况简述 在开发Android app的过程中,遇到这样一个需求:app中启动一个Service,该Service在独立进程中运行,与服务器保持长连接,将服务器推送过来的消息在通知栏中显示,并设置点击动作,点击后跳转到app中对应的Activity.目前遇到的问题是Service以独立进程运行,在收到消息并弹出通知后,app本身的进程有两种情况: app正在运行 app已退出 对于第一种情况,处理

js弹框3秒后自动消失

开发中有时候会需要最出弹框后,过几秒自动消失的效果,下面给大家分享一下我自己做的一个小案例. 案例中的弹框使用的是bootstrap里面的模态框,实现自动消失则用的是js中的setInterval方法.该弹框使用了jquery-ui中的draggable方法,可拖动. 目录结构如下: 下面是案例代码: demo.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti

js实现网页多少秒后自动跳转到指定网址

在网上搜了一下,关于这个技术处理有多种方法,我只记下我在视频里学到的三种: 1.用一个response.sendRedirect("目标页面.jsp\.htm");实现直接跳转: 2.有时我们需要有点提示,比如“x秒后自动跳转,若没有跳转,请点击此处”,则可以在myeclipse中调用Snippets中的Delay Go To URL.会自动生成如下代码: 代码如下: <script language="JavaScript1.2" type="te

用js在网页上完成倒计时3秒后自动跳转到另一个页面

<body> <div id="time"></div> <a href="#" onclick="stop()">停止</a> <script type="text/javascript"> var i=3; function changeTime(){ document.getElementById("time").innerHTM

5秒后跳转-js代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

C# 版本的 计时器类:精确到微秒 秒后保留一位小数 支持年月日时分秒带单位的输出

class TimeCount { // 临时变量,存放当前类能表示的最大年份值 private static ulong MaxYear = 0; /// <summary> /// 获取毫秒能表示的最大年份数 /// </summary> /// <returns>年份数最大值</returns> public static ulong GetMaxYearCount() { if (TimeCount.MaxYear != 0) return Time