Android 电量监控、关机、重启功能的实现

2023-05-16

本文主要是介绍Android电量监控、关机、重启功能的实现,需要具备的条件是手机需要root过,才能实现相关操作。

1.MainActivity.java

import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends  Activity {
	private String TAG="MainActivity";
	private Button startBtn;
	private Button stopBtn;
	private Button rebootBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(MainActivity.this,BatteryCheckService.class);
        startService(intent);//开启服务
        Log.d(TAG,"开启服务");
        
        //初始化控件
        rebootBtn= (Button) findViewById(R.id.reboot);
        startBtn =(Button)findViewById(R.id.start);
		stopBtn =(Button)findViewById(R.id.stop);
		
		//开始启动电量监控
		startBtn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(MainActivity.this,BatteryCheckService.class);
				startService(intent);
			}
		});
		//停止电量监控
		stopBtn.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					Intent intent = new Intent(MainActivity.this,BatteryCheckService.class);
					stopService(intent);
				}
			});
	//重启机器
	rebootBtn.setOnClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			String cmd = "su -c reboot";
            try {
                    Runtime.getRuntime().exec(cmd);
            } catch (IOException e) {
                    // TODO Auto-generated catch block
/*
                    new AlertDialog.Builder(this).setTitle("Error").setMessage(
                                    e.getMessage()).setPositiveButton("OK", null).show();*/
            }
		}
	});
    }

}

2.BatteryCheckService.java

import java.io.DataOutputStream;
import java.io.IOException;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.widget.Toast;

public class BatteryCheckService extends Service {
	 /* 变量声明 */
	  private int intLevel;
	  private int intScale; 
	  /* create BroadcastReceiver */
	  private BroadcastReceiver mBatInfoReceiver=new BroadcastReceiver()
	  {  
	    public void onReceive(Context context, Intent intent) 
	    { 
	      String action = intent.getAction();  
	      /* 如果捕捉到的action是ACTION_BATTERY_CHANGED,
	       * 就执行onBatteryInfoReceiver() */
	      if (Intent.ACTION_BATTERY_CHANGED.equals(action)) 
	      { 
	        intLevel = intent.getIntExtra("level", 0);  
	        intScale = intent.getIntExtra("scale", 100); 
	        onBatteryInfoReceiver(intLevel,intScale);
	      }  
	    } 
	  };
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public int  onStartCommand(Intent intent,int flags,int startId){
		 //  setContentView(R.layout.activity_main);
        /* 注册几个系统 BroadcastReceiver,作为访问电池计量之用 */ 
        registerReceiver  (mBatInfoReceiver, 
        		new IntentFilter(Intent.ACTION_BATTERY_CHANGED)  );
       
		return  super.onStartCommand(intent,flags,startId);
		
	}
	
	  /* 拦截到ACTION_BATTERY_CHANGED时要执行的method */
    public void onBatteryInfoReceiver(int intLevel, int intScale) 
    {
    	// 如果当前电量小于总电量的10%
    			if (intLevel* 1.0 /intScale < 0.10)
    			{
    				Toast.makeText(getApplicationContext(), "当前手机电量剩余"+String.valueOf(intLevel * 100 / intScale) + "%"+",电量过低,请尽快充电!"
    						, Toast.LENGTH_LONG).show();
    				shutdown() ;
    			}else{
    				Toast.makeText(getApplicationContext(), "当前手机电量剩余"+String.valueOf(intLevel * 100 / intScale) + "%"+"电量正常,可以正常使用!"
    						, Toast.LENGTH_LONG).show();
    			}
    }
    
    //关机
    private void shutdown() {  
        try {  
            Process process = Runtime.getRuntime().exec("su");  
            DataOutputStream out = new DataOutputStream(  
                    process.getOutputStream());  
            out.writeBytes("reboot -p\n");  
            out.writeBytes("exit\n");  
            out.flush();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
    
    @Override  
    public void onDestroy() {//重写onDestroy方法  
        this.unregisterReceiver(mBatInfoReceiver);//取消注册的CommandReceiver  
        super.onDestroy();  
    }    
}

3.布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dip"
        android:textStyle="bold"
        android:textSize="24dip"
        android:text="电量监控" 
        android:layout_gravity="center"/>
    
    <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dip"
        android:layout_gravity="center">
    <Button
        android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始"/>

     <Button
        android:id="@+id/stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止"/>
     
     <Button
        android:id="@+id/reboot"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="重启"/>
     
     </LinearLayout>
     
</LinearLayout>

4.配置文件AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.batterycheckserver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    
 	<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 	
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
   <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>  
        
        <service 
            android:name=".BatteryCheckService">
	</service>
        <!--  <receiver android:name=".BootReceiver">        
          <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED"/>
     				<category android:name="android.intent.category.LAUNCHER" />    
          </intent-filter>
          </receiver>  -->
    </application>

</manifest>


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 电量监控、关机、重启功能的实现 的相关文章

  • 版本管理-创建git仓库

    创建git仓库 把已有的项目代码纳入git管理 span class token builtin class name cd span 项目代码所在文件夹 span class token function git span init 新建
  • git 撤销commit

    撤销未push的commit span class token comment 用户已经执行的操作 span span class token function git span span class token function add
  • Django整理01:启动流程

    目录 启动 启动 span class token comment 启动命令 xff1a span python manage py runserver span class token comment 运行先文件的handler函数 sp
  • 差量更新问题记录

    问题 xff1a 升级后台配置了差量更新 xff0c 但是用户设备检测到的是全量更新 xff0c 测试设备检测到的是差量更新 原因 xff1a 差量更新需要具备的条件 xff1a 1 升级后台配置了差量更新的链接 2 设备对应的目录下有ba
  • Linux操作系统的启动过程

    Linux操作系统的启动过程 一 Linux操作系统的开机过程二 初始化进程服务三 服务管理命令 一 Linux操作系统的开机过程 Linux操作系统的开机过程可简记为 xff1a 两次检测 xff0c 一次装载 即首先对BIOS做初始化
  • manifest.json参数详解

    从官网文档翻译而来 xff0c 比大多数网上现有资源详细很多 xff0c 部分官网没有的属性通过stackoverflow xff0c 甚至是chromium源码查询而来 还有一些没注释的是查询不到或者本人无法确定的 官方文档地址 xff1
  • C语言经典例25-阶乘累加求和

    目录 1 题目2 分析3 实现4 运行结果 1 题目 求1 43 2 43 3 43 43 20 的和 2 分析 本题的本质就是求阶乘 xff0c 观察规律可以发现 xff0c 1 1 1 和
  • centos7 双击程序启动不了

    1 在终端输入ldd test 查看程序依赖的库 2 如果依赖库都存在 xff0c 双击程序启动不了 xff0c 但是在终端输入 test 却可以启动 原因解释 xff1a 在终端输入的程序是带路径的 xff0c 双击的时候是不带路径的 x
  • Ubuntu修改密码及密码复杂度策略设置方法

    版本查看 cat span class token operator span etc span class token operator span issue cat span class token operator span proc
  • 2022小米红米手机最新最全MIUI刷机教程内测版到稳定版 不清除数据(线刷、卡刷)

    文章目录 方法1 xff1a 解锁 线刷手机解锁解锁软件接入电脑刷机工具下载下载刷机包线刷 方法2 xff1a 小米助手卡刷包下载小米助手PC客户端打开手机USB调试模式连接小米助手卡刷miui卡刷包下载 起因是因为意外升级了一版内测版mi
  • TreeSet录入重复的元素及保证录入&输出顺序一致的Java实现

    Java萌新在学习路上遇到的一个扯dan的问题解法 知识点 Set TreeSet TreeSet自然排序 TreeSet比较器排序 Comparator 原题目 请编写main 方法 xff0c 按以下要求顺序 循环接收控制台录入的字符串
  • SpringBoot无法访问static文件夹 404问题

    使用spring boot 配置好后端 导入前端页面到resources 61 gt static 文件夹后 无法访问 但此时进入调试模式 访问controller的路径时 发现后台已经传送出去json数据 64 RequestMappin
  • Ubuntu虚拟机反复在登录界面循环问题

    登录Ubuntu的时候发现登录界面不对劲 xff0c 之前从来没有看到过 而且无法登录 xff0c 反复在登录界面循环 百度 xff0c 说原因有两个 xff1a 1 环境变量修改有问题 xff1b 2 显卡驱动有问题 xff1b 均尝试数
  • pycharm设置笔记

    目录 区分级别显示高亮日志 区分级别显示高亮日志 效果 设置log highlighting里填入 s E RROR s 即可 s E RROR s
  • Ubuntu设置开机自启动

    文章目录 前言一 基本概念二 操作步骤1 终端输入2 设置路径 总结 前言 本文介绍如何在Ubuntu设置开机自启动 一 基本概念 除了系统上配置的默认启动应用程序之外 xff0c gnome session properties 程序使用
  • uniapp 发布网站遇到的问题(跨域,nginx代理失败,index无法打开,手机端无法访问等)

    跨域 如果开发的应用直接是作为手机APP是不存在跨域问题的 xff0c 但是如果是网站形式就要考虑这个问题了 分为两点 xff1a 1 调试时 可通过设置maintest 2 发布后 可通过Nginx配置文件设置代理 nginx代理失败 1
  • 怎么在linux上安装vnc

    1 首先检查是否安装了VNC服务 输入命令 xff1a rpm qa grep vnc 2 安装VNC xff0c 首次执行vncserver需要设置密码 xff0c 可以创建多个桌面 xff0c 执行多次vncserver命令即可 roo
  • VNC修改端口号

    1 vnc的默认端口是自己配置的 xff0c 想要修改vncserver的配置 xff0c 需要先找配置文件路径 root 64 node04 which vncserver usr bin vncserver 2 通过查找以前配置的端口
  • onNewIntent使用遇到的坑

    onCreate是用来创建一个Activity也就是创建一个窗体 xff0c 但一个Activty处于任务栈的顶端 xff0c 若再次调用startActivity去创建它 xff0c 则不会再次创建 若你想利用已有的Acivity去处理别
  • CentOS7使用firewall-cmd打开关闭防火墙与端口

    一 centos7版本对防火墙进行加强 不再使用原来的iptables 启用firewalld 1 firewalld的基本使用 启动 xff1a systemctl start firewalld 查状态 xff1a systemctl

随机推荐