1. 程式人生 > >Android 實現定時開關機另類實現--BSP級

Android 實現定時開關機另類實現--BSP級

前言:

條件,定時關機不能關機,只能待機;要能定時“開機”(喚醒)

1.定時“關機”(待機)

     眾所周知android 有wakelock 在有wakelock 時不能待機,可按如下的方法進行待機;

    Java:

             啟動force sleep 服務,只是執行force_sleep_part1.sh

            SystemProperties.set("ctl.start", "force_sleep");

     init.xxx.rc

定義force_sleep服務

            service force_sleep /system/bin/force_sleep_part1.sh
        oneshot                                           
        disabled

       force_sleep_part1.sh 

           切換root 執行force_sleep_part2.sh

      su -s /bin/sh /system/bin/force_sleep_part2.sh

      force_sleep_part2.sh 

          強制寫/sys/power/state 來進行待機

      echo mem > /sys/power/state

2.定時“開機” (喚醒)

    此處折磨了我兩天,終於在一個朋友的指點下找到原因。

    NOTE:  在有的廠商會控制通過RTC喚醒機器的程式,比如本人開發的這個平臺會根據包名判斷此包名內的程式是否在喚醒機器白名單內,每個廠商可能在不同的位置控制,碰到這個問題,不要一味的找自己寫的程式碼的問題,還是要相信自己的。查下相關的流程,看下是否在哪修改掉了;比如在我使用的BSP中

frameworks/base/services/java/com/android/server/AlarmManagerService.java

608     private static final String[] sAlarmWhiteList = {
609         "com.android.providers.calendar",
610         "com.android.alarmclock",
611         "com.android.deskclock",
612         "com.android.keyguard",                          
614     };
 616     /* 
 617      * Only packages above can set RTC_WAKEUP/ELAPSED_REALTIME_WAKEUP alarm.
 618      */
 619     private int filterType(int type, PendingIntent operation) {
 620         if( type == AlarmManager.RTC_WAKEUP || type == AlarmManager.ELAPSED_REALTIME_WAKEUP  ) {
 621             String pakeageName = operation==null?null:operation.getTargetPackage();
 622             for(String packet : <strong><span style="color:#ff0000;">sAlarmWhiteList</span></strong>) {
 623                 Slog.v("kevin", "packagename = "+ pakeageName);
 624                 if( packet.equals(pakeageName) ) {
 625                     return type;
 626                 }
 627             }
 628             type = (type == AlarmManager.RTC_WAKEUP ) ? AlarmManager.RTC : AlarmManager.ELAPSED_REALTIME;
 629         }
 630         return type;
 631     }    
 

AlarmManager 使用比較簡單,但因為上面的原因,讓我反覆查了幾十遍;

如下:

			Calendar c = Calendar.getInstance();
			int length = timeonArray.length;
			c.set(Calendar.YEAR, timeonArray[0]);
			c.set(Calendar.MONTH, timeonArray[1] -1 );
			c.set(Calendar.DAY_OF_MONTH, timeonArray[2]);
			c.set(Calendar.HOUR_OF_DAY, timeonArray[3]);
			c.set(Calendar.MINUTE, timeonArray[4]);
			c.set(Calendar.SECOND, 0);
			c.set(Calendar.MILLISECOND, 0); 
			
			Intent  PowerOnIntent = new Intent();
			PowerOnIntent.setAction(DataObject.ACTION_ALARM_POWER_ON_TIMER_OUT);
			PowerOnIntent.setClass(mContext, BroadcastReciver.class);
			mPowerOnPendingIntent = PendingIntent.getBroadcast(mContext,
	                0, PowerOnIntent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
			if (isKitKatOrLater()) {
				mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), mPowerOnPendingIntent);
			} else {
				mAlarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), mPowerOnPendingIntent);
			}
就如上的程式碼就OK了。

3.android 重啟

CommonUntils.ShellCommand("reboot");
Intent rebootIntent = new Intent(Intent.ACTION_REBOOT);
rebootIntent.putExtra("nowait", 1);
rebootIntent.putExtra("interval", 1);
rebootIntent.putExtra("window", 0);
mContext.sendBroadcast(rebootIntent);

基本上,按如上的方法,定時“開關”(待機,喚醒)機是沒有任何問題的。

相關推薦

Android 實現定時關機實現--BSP

前言: 條件,定時關機不能關機,只能待機;要能定時“開機”(喚醒) 1.定時“關機”(待機)      眾所周知android 有wakelock 在有wakelock 時不能待機,可按如下的方法進行待機;     Java:              啟動force sl

Android系統定時關機實現簡述

本實驗基於Android6.0 一 概述: Android系統的定時開關機的實現分為定時開機和定時關機兩部分,其中定時關機比較容易,因為不需要底層驅動的配合,只需要發特定廣播就可以完成,而定時開機的實現稍微麻煩一些,因為需要底層RTC驅動的配合。 二 定時關機 定時關機實現核

android定時關機實現

關於android自動關機,網上有很多應用程式和例子。 相對於自動開機來說,自動關機可以在應用層通過設定alarm來實現。而自動開機,它需要底層rtc時鐘的支援。我自己也沒做過這個,不過在網上查到一個自動開機的實現方法。 簡介 我的實現是在設定程式裡面增加一個介面,讓

Android圓角Tag控件的實現

tao 這樣的 frame set tag 建議 開啟 height 基本 一般的圓角標簽控件都是用xml設置shape做實現。可是假設我們想要做一個更加強大通用的的圓角控件,不須要使用者去關心圓角,僅僅設置背景就能夠了。應該怎麽實現呢?這個就須要把背景先設置成圖片

實現 ScrollView 下拉頭部放大

一、前言 前兩天接到一個在列表下拉時頭部放大的需求,也就是這樣的效果: 二、思路 查了查資料,這樣的效果一般都是通過自定義 ScrollView 來實現,不過我總覺得這樣挺麻煩的,需要去修改原來的 XML 檔案,而且侷限性也挺大,需要縮放的控制元件必須放在第一個,在看了別人實現

DataTracker -- 窗體之間的聯動, 觀察者模式的實現

DataTracker, 是本人在程式設計實踐中為了解決窗體之間的聯動而實現的工具類。 主要用於解決:在一個窗體中修改了資料,而另一個使用此資料的窗體實現自動的資料更新。 它有以下特點: 1) 物件之間的鬆藕合性。兩個窗體或多個窗體之間,相互之間不需要知道對方的存在。 2) 可以實現

CAS統一登入認證(17): QQ,微信,人臉識別等第三方登入的實現

CAS本身支援許多第三方賬號登入認證,如facebook,github,google賬號等,簡單配置即可實現,網上也有一些通過改程式碼或增加代理網站實現QQ,微信登入的,但所有這些登入認證,最後使用者賬號並不是自己資料庫儲存的賬號,而是第三方的openid或者暱稱等,不是我們所需要的,轉換為對應的資

Linux中Shutdown命令實現定時自動關機

Shutdown命令可以安全地關閉或重啟Linux系統,在Linux中可以用shutdown命令實現自動定時關機的功能,它在Linux系統關閉之前給系統上的所有登入使用者提示一條警告資訊。該命令還允許使用者指定一個時間引數,可以是一個精確的時間,也可以是從現在開始的一個時間段。

DJANGO 實時系統的實現

http://scriptogr.am/pison/post/django- 概述 基於Tornado, Redis, Django, SSE協議 實現Django的實時通訊系統 緣起 業務上要求能夠實現一旦伺服器收到警報,立刻將資訊反饋到頁面——簡單地說,就是

Android進階封裝之一個實現相容Android 6.0許可權、適配Android7.0 拍照!

Android進階封裝之“史無前例”一個類實現相容Android 6.0許可權、適配Android 拍照7.0: 相機與相簿上傳圖片就用我好啦! 一、前言。 本篇部落格從基本的AndroidN開始說怎麼適配其拍照,其與7.0以下有何區別

iOS開發之AVPlayer的精彩使用--->網易新聞視訊播放介面的實現

遇到個需求需要涉及到視訊播放,那麼沒辦法,先找資料開始進一步瞭解下這個不熟悉的東西.一個是MP,一個是AV,MP是封裝好的,用起來非常簡單,但是自定義樣式就基本不可能了。AVPlayer存在於AVFundation中,更接近於底層,所以靈活性更強大,廢話不多說,咱們先簡單寫個

WPF實現攝像頭錄影

WPF中使用第三方控制元件來直接進行錄影的控制元件沒有找到(aforgenet好像不維護了?WPFMediaKit好像只能實現攝像頭拍照。收費的控制元件沒有使用,不做評論。) 通過百度(感謝:https://www.cnblogs.com/giserlong88/p/11244779.html),確定了可以通

Spring2.5學習4.2_Proxy實現動態代理(目標實現隨意接口)

靈活 iss sta blank 輸入 font ima tar ons 靜態代理的缺點是在代理類中綁定了固定的接口,不利於擴展,動態代理則不然,通過動態代理能夠對不論什麽實現某一接口的類進行功能性增強。 在java中動態代理由InvocationHander來實現。

alias,data,系統定時關機的基本操作

技術 分鐘 -s ima 顏色 24小時 ctrl nali 寫法 1.修改命令提示符的格式,及每個字母所代表的功能,顯示提示符格式輸入echo $PS1PS1="[\u@\h \W]\$"\e 或\033啟用顏色 \u當前用戶 \h主機名簡稱 \H主機

內部類實現多繼承(內部類的優勢)及內部類實現一個介面與外圍實現這個介面的區別

在java中一個類可以多重實現,但不能多重繼承,也就是說一個類能夠同時實現多個介面,但不能同時繼承多個類。但有時候我們確實需要繼承多個類,比如希望擁有兩個類的行為功能,就很難使用單繼承來解決問題了(當然多層繼承是可以解決的),那麼我們還可以用什麼辦法來解決多重繼承的問題呢?沒

內部類實現一個介面與外圍實現這個介面的區別

在java中,外圍類只能繼承一個基類,要實現多繼承,只有繼承多個介面型別。有時,你需要與介面的實現進行互動,所以使用內部類最重要的一個原因是:每個內部類都能獨立的繼承自一個(介面的)實現,內部類允許你繼承多個非介面型別。正是因為內部類的這種能力,有效的實現了“多重繼承”。

【資料結構與演算法-java實現】三 Java陣列實現

上一篇文章學習了:最好、最壞、平均、均攤時間複雜度的計算與分析方法. 本片文章學習陣列這種結構。由於陣列這種結構比較簡單,本文直接簡單介紹,然後給出兩種實現陣列類的Java程式碼:整形陣列類與通用性的陣列類 由於陣列是相比於其他資料結構實在太簡

application實現以及如何使用application實現全域性變數傳值

Application類 Application和Activity,Service一樣是Android框架的一個系統元件,當Android程式啟動時系統會建立一個Application物件,用來儲存系統的一些資訊。 Android系統自動會為每個程式執行時建立一個Appli

定時關機的八種方法

“你會開機嗎?”如果筆者問大家這樣的問題,想必會引來一大堆的臭雞蛋。不過筆者現在是要問“你知道有幾種開機方法?”想必沒有多少人能完全回答上來。因為除了接上電源,按下主機面板的電源開關進行開機外,還有八種開機方法。如果你不相信的話,就跟著筆者所使用的美達S845E主機板

史上最全面的SignalR系列教程-3、SignalR 實現推送功能-集線器實現方式

1、概述 通過前兩篇 史上最全面的SignalR系列教程-1、認識SignalR 史上最全面的SignalR系列教程-2、SignalR 實現推送功能-永久連線類實現方式 文章對SignalR的介紹,我們對SignalR已經有了全面的認識。SignalR API 客戶端和伺服器端持久連線的通訊方式,一次連線代