热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android9.0系统定时关机的实现

1.简述由于9.0版本对系统安全性要求越来越严格,所以开关机的api对于应用层都不能调用了,要实现定时关机必须是系统应用要在Androidmanife

1.简述

由于9.0版本对系统安全性要求越来越严格,所以开关机的api对于应用层都不能调用了,要实现定时关机必须是系统应用 要在Androidmanifest.xml 中添加 android:sharedUserId=“android.uid.system”

2.代码部分

import android.annotation.SuppressLint;
import android.content.Context;
import android.support.v7.preference.Preference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
import com.android.tv.settings.R;
import java.util.Calendar;
import java.util.TimeZone;
import android.widget.TextView;
import android.support.v4.content.res.TypedArrayUtils;
import android.support.v7.preference.PreferenceViewHolder;
import android.content.Intent;
import android.app.Instrumentation;
import android.view.KeyEvent;
import android.widget.DatePicker;
import android.content.SharedPreferences;
import android.support.v7.preference.PreferenceManager;
import android.text.format.Time;
import java.util.Date;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import java.text.SimpleDateFormat;
import com.android.tv.settings.system.AlarmBroadcastReciver;public class PreferenceWithPowerOff extends Preference {private static final String TAG &#61; "PreferenceWithPowerOff";private TimePicker mTimepicker;private DatePicker mDatePicker;private Button btn;private Context mContext;private int mHour;private int Minute,mYear,Month,mDay;private Calendar calendar;private AlarmManager alarmManager;public PreferenceWithPowerOff(Context context, AttributeSet attrs, int defStyleAttr) {this(context, attrs, defStyleAttr, 0);}public PreferenceWithPowerOff(Context context, AttributeSet attrs) {this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,android.R.attr.dialogPreferenceStyle));}public PreferenceWithPowerOff(Context context) {this(context,null);}public PreferenceWithPowerOff(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr,defStyleRes);this.mContext&#61;context;alarmManager &#61; (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);}&#64;Overridepublic void onBindViewHolder(PreferenceViewHolder holder) {super.onBindViewHolder(holder);TextView txt &#61; (TextView) holder.itemView.findViewById(R.id.title_txt);txt.setText(mContext.getResources().getString(R.string.setting_power_off));mDatePicker &#61; (DatePicker)holder.itemView.findViewById(R.id.datetimepicker);mTimepicker &#61; (TimePicker) holder.itemView.findViewById(R.id.timepicker);mTimepicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);mTimepicker.setIs24HourView(true);getCurData();btn &#61; (Button)holder.itemView.findViewById(R.id.power_on_btn);btn.setOnClickListener(new View.OnClickListener() {&#64;Overridepublic void onClick(View v) {if(!isLaterCurrentTime()) {Toast.makeText(mContext, "关机时间必须比当前时间晚1分钟....", Toast.LENGTH_SHORT).show();return;}String houroftime &#61;mHour<10? "0"&#43;mHour:""&#43;mHour;String hourofminute &#61;Minute<10? "0"&#43;Minute:""&#43;Minute;try {SharedPreferences prefs &#61;mContext.getSharedPreferences("data",Context.MODE_PRIVATE);SharedPreferences.Editor editor &#61;prefs.edit();editor.putString("set_poweroff",mYear&#43;"-"&#43;Month&#43;"-"&#43;mDay&#43;" "&#43;houroftime&#43;":"&#43;hourofminute&#43;":00");editor.putBoolean("is_poweroff",true);boolean result &#61; editor.commit();//实现定时关机的关机代码如下SimpleDateFormat simpleDateFormat &#61; new SimpleDateFormat("yyyy-MM-dd HH:mm");Date date &#61; simpleDateFormat.parse(mYear&#43;"-"&#43;Month&#43;"-"&#43;mDay&#43;" "&#43;houroftime&#43;":"&#43;hourofminute);Intent intent &#61; new Intent(mContext,AlarmBroadcastReciver.class);//是否显示关机提示dialog&#xff0c;true显示false不显示直接关机//intent.putExtra("android.intent.extra.KEY_CONFIRM", true);//intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);PendingIntent pi &#61; PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);//Log.e("PreferenceWithPower","date:"&#43;mYear&#43;"-"&#43;Month&#43;"-"&#43;mDay&#43;" "&#43;houroftime&#43;":"&#43;hourofminute&#43;"---result:"&#43;result&#43;"----timer:"&#43;date.getTime());alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pi);//设定时间启动定时器,new Thread(new Runnable() {&#64;Overridepublic void run() {new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);}}).start();} catch (Exception e) {e.printStackTrace();}}});}private void getCurData(){calendar &#61; Calendar.getInstance();calendar.setTimeZone(TimeZone.getTimeZone("GMT&#43;8:00"));mYear&#61;calendar.get(Calendar.YEAR);Month&#61;calendar.get(Calendar.MONTH)&#43;1;mDay&#61;calendar.get(Calendar.DAY_OF_MONTH);mDatePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {&#64;Overridepublic void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {// Log.e(TAG,"year:"&#43;year&#43;"--monthOfYear:"&#43;monthOfYear&#43;"---dayOfMonth:"&#43;dayOfMonth);mYear&#61;year;Month &#61; monthOfYear&#43;1;mDay &#61; dayOfMonth;}});mHour &#61; calendar.get(Calendar.HOUR_OF_DAY);Minute&#61;calendar.get(Calendar.MINUTE);mTimepicker.setHour(calendar.get(Calendar.HOUR_OF_DAY));mTimepicker.setMinute(calendar.get(Calendar.MINUTE));mTimepicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { //获取当前选择的时间&#64;Overridepublic void onTimeChanged(TimePicker view, int hourOfDay, int minute) {//Log.e(TAG,"hour:"&#43;hourOfDay&#43;"--minute:"&#43;minute);mHour &#61; hourOfDay;Minute &#61;minute;}});}private boolean isLaterCurrentTime(){int year &#61; calendar.get(Calendar.YEAR);int month &#61; calendar.get(Calendar.MONTH)&#43;1;int day &#61; calendar.get(Calendar.DAY_OF_MONTH);int hour &#61; calendar.get(Calendar.HOUR_OF_DAY);int minute &#61; calendar.get(Calendar.MINUTE);Log.e("PreferenceWithPower","off --year :"&#43;year&#43;"---month:"&#43;month &#43;"--day"&#43;day&#43;"--hour :"&#43;hour &#43;"--minute :"&#43;minute);if(year<mYear){return true;}else if(year &#61;&#61; mYear){if(month<Month){return true;}else if(month&#61;&#61;Month){if(day<mDay){return true;}else if(day&#61;&#61;mDay){if(hour<mHour){return true;}else if(hour&#61;&#61;mHour){if(minute<&#61;Minute-1){return true;}else{return false;}}else{return false;}}else{return false;}}else{return false;}}else{return false;}}
}

3.AlarmBroadcastReciver.class 广播部分代码

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import android.os.Build;
import android.os.IBinder;
import java.lang.reflect.Method;
import java.io.DataOutputStream;
import java.io.IOException;/*** Created by hi on 2016/8/11.*/
public class AlarmBroadcastReciver extends BroadcastReceiver {&#64;Overridepublic void onReceive(Context context, Intent intent) {//Toast.makeText(context,"关机啦", Toast.LENGTH_SHORT).show();if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {try {Class<?> serviceManager &#61; Class.forName("android.os.ServiceManager");Method getService &#61; serviceManager.getMethod("getService", String.class);Object remoteService &#61; getService.invoke(null, Context.POWER_SERVICE);Class<?> stub &#61; Class.forName("android.os.IPowerManager$Stub");Method asInterface &#61; stub.getMethod("asInterface", IBinder.class);Object powerManager &#61; asInterface.invoke(null, remoteService);Method shutdown &#61; powerManager.getClass().getDeclaredMethod("shutdown",boolean.class, String.class, boolean.class);shutdown.invoke(powerManager, false, "", true);} catch (Exception e) {//nothing to do}}}
}


推荐阅读
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 【问题描述】给定一个单向链表,要求使用Java编程语言实现从链表尾部到头部的逆序打印功能。该功能通过利用栈的数据结构来实现,最终将结果存储在一个ArrayList中返回。具体实现步骤如下:1. 遍历链表,将每个节点的值依次压入栈中。2. 从栈中逐个弹出元素,并将其添加到ArrayList中。3. 返回包含逆序链表元素的ArrayList。这种方法充分利用了栈的后进先出特性,确保链表元素能够按照从尾到头的顺序被正确处理。 ... [详细]
  • 类加载机制是Java虚拟机运行时的重要组成部分。本文深入解析了类加载过程的第二阶段,详细阐述了从类被加载到虚拟机内存开始,直至其从内存中卸载的整个生命周期。这一过程中,类经历了加载(Loading)、验证(Verification)等多个关键步骤。通过具体的实例和代码示例,本文探讨了每个阶段的具体操作和潜在问题,帮助读者全面理解类加载机制的内部运作。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 在Python中,是否可以通过使用Tkinter或ttk库创建一个具有自动换行功能的多行标签,并使其宽度能够随着父容器的变化而动态调整?例如,在调整NotePad窗口宽度时,实现类似记事本的自动换行效果。这种功能在设计需要显示长文本的对话框时非常有用,确保文本内容能够完整且美观地展示。 ... [详细]
  • 深入解析 Android TextView 中 getImeActionLabel() 方法的使用与代码示例 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
author-avatar
流云清动_438
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有