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 = "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=context;alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);}@Overridepublic void onBindViewHolder(PreferenceViewHolder holder) {super.onBindViewHolder(holder);TextView txt = (TextView) holder.itemView.findViewById(R.id.title_txt);txt.setText(mContext.getResources().getString(R.string.setting_power_off));mDatePicker = (DatePicker)holder.itemView.findViewById(R.id.datetimepicker);mTimepicker = (TimePicker) holder.itemView.findViewById(R.id.timepicker);mTimepicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);mTimepicker.setIs24HourView(true);getCurData();btn = (Button)holder.itemView.findViewById(R.id.power_on_btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(!isLaterCurrentTime()) {Toast.makeText(mContext, "关机时间必须比当前时间晚1分钟....", Toast.LENGTH_SHORT).show();return;}String houroftime =mHour<10? "0"+mHour:""+mHour;String hourofminute =Minute<10? "0"+Minute:""+Minute;try {SharedPreferences prefs =mContext.getSharedPreferences("data",Context.MODE_PRIVATE);SharedPreferences.Editor editor =prefs.edit();editor.putString("set_poweroff",mYear+"-"+Month+"-"+mDay+" "+houroftime+":"+hourofminute+":00");editor.putBoolean("is_poweroff",true);boolean result = editor.commit();//实现定时关机的关机代码如下SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");Date date = simpleDateFormat.parse(mYear+"-"+Month+"-"+mDay+"  "+houroftime+":"+hourofminute);Intent intent = new Intent(mContext,AlarmBroadcastReciver.class);//是否显示关机提示dialog,true显示false不显示直接关机//intent.putExtra("android.intent.extra.KEY_CONFIRM", true);//intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);//Log.e("PreferenceWithPower","date:"+mYear+"-"+Month+"-"+mDay+"  "+houroftime+":"+hourofminute+"---result:"+result+"----timer:"+date.getTime());alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pi);//设定时间启动定时器,new Thread(new Runnable() {@Overridepublic void run() {new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);}}).start();} catch (Exception e) {e.printStackTrace();}}});}private void getCurData(){calendar = Calendar.getInstance();calendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));mYear=calendar.get(Calendar.YEAR);Month=calendar.get(Calendar.MONTH)+1;mDay=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() {@Overridepublic void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {// Log.e(TAG,"year:"+year+"--monthOfYear:"+monthOfYear+"---dayOfMonth:"+dayOfMonth);mYear=year;Month = monthOfYear+1;mDay = dayOfMonth;}});mHour = calendar.get(Calendar.HOUR_OF_DAY);Minute=calendar.get(Calendar.MINUTE);mTimepicker.setHour(calendar.get(Calendar.HOUR_OF_DAY));mTimepicker.setMinute(calendar.get(Calendar.MINUTE));mTimepicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {  //获取当前选择的时间@Overridepublic void onTimeChanged(TimePicker view, int hourOfDay, int minute) {//Log.e(TAG,"hour:"+hourOfDay+"--minute:"+minute);mHour = hourOfDay;Minute =minute;}});}private boolean isLaterCurrentTime(){int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH)+1;int day = calendar.get(Calendar.DAY_OF_MONTH);int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);Log.e("PreferenceWithPower","off --year :"+year+"---month:"+month +"--day"+day+"--hour :"+hour +"--minute :"+minute);if(year<mYear){return true;}else if(year == mYear){if(month<Month){return true;}else if(month==Month){if(day<mDay){return true;}else if(day==mDay){if(hour<mHour){return true;}else if(hour==mHour){if(minute<=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 {@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 = Class.forName("android.os.ServiceManager");Method getService = serviceManager.getMethod("getService", String.class);Object remoteService = getService.invoke(null, Context.POWER_SERVICE);Class<?> stub = Class.forName("android.os.IPowerManager$Stub");Method asInterface = stub.getMethod("asInterface", IBinder.class);Object powerManager = asInterface.invoke(null, remoteService);Method shutdown = powerManager.getClass().getDeclaredMethod("shutdown",boolean.class, String.class, boolean.class);shutdown.invoke(powerManager, false, "", true);} catch (Exception e) {//nothing to do}}}
}

android 9.0系统定时关机的实现相关推荐

  1. 怎么设置linux系统定时关机,Linux系统定时关机

    Linux系统定时关机 shutdown命令关机 各参数功能: -c 取消前一个shutdown命令. -f 重新启动时不执行fsck(注:fsck是Linux下的一个检查和修复文件系统的程序). - ...

  2. php能做定时关机吗,window_win10怎么定时关机?Win10系统定时关机命令使用方法详解,对于电脑用户来说,定时关机 - phpStudy...

    win10怎么定时关机?Win10系统定时关机命令使用方法详解 对于电脑用户来说,定时关机有时候经常会用到,比如夜间下载东西或者下载一些大文件,而又没有时间一直守着电脑,这时候设置电脑定时关机就很实用 ...

  3. 《深入解析Android 5.0系统》——第1章,第1.2节安装开发包

    本节书摘来自异步社区<深入解析Android 5.0系统>一书中的第1章,第1.2节安装开发包,作者 刘超,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.2 ...

  4. nokia android 8,疑似诺基亚8再曝光:预装Android 8.0系统

    [TechWeb报道]8月4日消息,之前诺基亚公布了诺基亚8手机,并且确认蔡司镜头认证.现在最新消息,来自GeekBench数据发现一款诺基亚机型,搭载骁龙835处理器,预装Android 8.0系统 ...

  5. android屏幕适配的五种方式_讲一讲Android 9.0系统的新特性,对刘海屏设备进行适配...

    黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Python开发点击右侧关注,探讨技术话题!作者丨郭霖来源丨郭霖(guolin_blog) 其实Android 9 ...

  6. android 系统源码调试 局部变量值_如何方便快速的整编Android 9.0系统源码?

    点击上方"刘望舒",选择"星标" 多点在看,就是真爱! 作者 :  刘望舒  |  来源 :刘望舒的博客地址:http://liuwangshu.cn/fram ...

  7. android 4.0系统,全新Android 4.0系统_手机Android频道-中关村在线

    与搭载Android 2.3系统的OPPO R807不同,OPPO R817搭载了Android 4.0系统.不过这款手机仍旧舍弃了Android系统的原生界面,因此两款手机在界面上的变化其实并不非常 ...

  8. android9谷歌推送,谷歌Android 9.0系统将统一推送以改善更新碎片化

    原标题:谷歌Android 9.0系统将统一推送以改善更新碎片化 玩懂手机网消息,Android和iOS一直是用户眼中两种不同的代名词,Android非常开放,是高度可定制的操作系统,设备制造商还是开 ...

  9. Android 8.0系统学习(19)--- SystemUI启动流程

    Android 8.0系统学习(19)--- SystemUI启动流程 systemui属于系统级应用,在开机过程中就会启动.具体来讲是在SystemServer进程中startOtherServic ...

最新文章

  1. 面试现场:小伙伴美团一面的分享和分析「含解答」
  2. T-SQL中default值的使用
  3. 【Web安全】关于SQL Injection和盲注的探索(DVWA)
  4. 添加服务引用的本质是什么?
  5. 安装 Ffmpeg 步骤
  6. C++中operator的两种用法
  7. 思卡乐科技发布SR3系列RFID产品
  8. Callable介绍
  9. html5作品分析报告,性能报告之HTML5 性能测试报告
  10. python读取图片转cvs_python将图片转换为csv
  11. 2022年熔化焊接与热切割操作证考试题库及答案
  12. date设置时间提示:Local time zone must be set--see zic manual page 2018
  13. 实现LZW字典压缩算法
  14. CSS基础学习(二)
  15. -XX:CMSInitiatingOccupancyFraction
  16. excel sql python_报表自动化,三流用Excel,二流用Python,一流用它
  17. 算法 时间复杂度概念及案例
  18. 数据治理工作的几种推进套路
  19. 让人才不再稀缺,让就业水到渠成 ——记传智播客总裁黎活明
  20. oracle数据库sql基础知识,Oracle数据库基础知识为内部培训资料.doc

热门文章

  1. C#项目中,使用应用程序清单文件 app.manifest 实现获得管理员权限等功能
  2. 中文分词好用的pyhanLP包
  3. fushia系统的编译环境搭建
  4. 面向机器翻译的全文检索系统
  5. 智能视频云3.0来了!基于AI-Native架构,赋能产业智能化
  6. 一张图看清客户价值-运用Tableau作RFM客户价值分析
  7. Seo搜索如何优化百度图片排名
  8. HTTPS原理及加密
  9. vue3 - 新一代的状态储存仓库 Pinia
  10. 华为鸿蒙系统支持什么手机_鸿蒙os2.0系统适配机型有哪些_华为鸿蒙系统支持的手机型号...