热门标签 | 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}}}
}


推荐阅读
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 详解Android  自定义UI模板设计_由浅入深
    学习安卓已有一些日子,前段时间整理了不少笔记,但是发现笔记不变分享与携带。今天开始整理博客,全当是与大家分享交流与自身学习理解的过程吧。结合最近在做的一个新闻类app及学习中的问题,一点一点整理一下, ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • fileuploadJS@sectionscripts{<scriptsrc~Contentjsfileuploadvendorjquery.ui.widget.js ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。 ... [详细]
  • 使用Flutternewintegration_test进行示例集成测试?回答首先在dev下的p ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • java unhandled,Eclipse编辑java文件报Unhandled event loop exception错误的解
    本人Eclipse版本是”eclipse-jee-kepler-SR2-win32-x86_64“昨天因为换电脑,所以重装了一下软件,装好eclipse ... [详细]
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社区 版权所有