日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于定时执行任务的解决方法,PendingIntent alarm braocastRecevier等等

發布時間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于定时执行任务的解决方法,PendingIntent alarm braocastRecevier等等 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在需要執行定時任務的類中定義如下:

? ? ? ? ? ? ?Intent intent=new Intent(SimpleWakefulController.this,SimpleWakefulReceiver.class);

? ? ? ? ? ? ?Pending intent=PedingIntent.getBroadcast(SimpleWakefulController.this,0,intent,0);

? ? ? ? ? ? ?

? ? ? ? ? ? ? Calendar calendar=Calendar.getInstance();

? ? ? ? ? ? ? calendar.setTimeInMillis(System.currentTimeMills());

? ? ? ? ? ? ?calendar.add(Calenda.Second,30);

? ? ? ? ?

? ? ? ? ? ? ?//Schedule the alarm

? ? ? ? ? ? AlarmManager am=(AlarmManager)getSystemService(AlARM_SERVICE);

? ? ? ? ? am.set(AlarmManager.PTC_WAKEUP,calendar.getTimeINMills(),sender);

? ? ? ? ??

? ? ? ? ? ? //Tell the user about what we did

? ? ? ? ? ?if(mToast!=null)

? ? ? ? ? ? ? ? ? ?mToast.cancel();

? ?在Receiver類繼承WakefulBroadcastReceiver中定義:

? ? ? ?Intent service=new Intent(context,SimpleWakefulService.class);

? ? ? ?

? ? ? ? startWakefulService(context,service);

在service類中:

? ? ? ? ? ? ?onHandleIntent來處理相應的房


為了避免消耗電池,一個空閑的設備很快就會進入休眠,但是有的時候需要應用保持屏幕或CPU喚醒來完成一些工作。

? ? ? 實現的方法取決于你的APP的要求,一般是采取最輕量級的方法,以減少你的APP對系統資源的影響。下面講述如何處理設備默認的休眠行為和應用需求之間的矛盾。


1.保持屏幕亮起

? ? ?某些APP需要保持屏幕一直亮起,如游戲和看電影。最好的方法就是在Activity(只是Activity,而不是services或其他App的組件)中使用FLAG_KEEP_SCREEN_ON標志。例如:

public?class?MainActivity?extends?Activity?{
??@Override
??protected?void?onCreate(Bundle?savedInstanceState)?{
????super.onCreate(savedInstanceState);
????setContentView(R.layout.activity_main);
????getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
??}

? ? ? 和wakelock(下面會討論到)比較,這個方法好處就是不需要申請權限,平臺就能正確地管理移動于應用之間的用戶,也不需要你的APP去考慮無用資源的釋放。

? ? ? 另一個方法去實現設備亮起就是在應用的布局文件中使用?Android:keepScreenOn屬性:

<RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android"
????android:layout_width="match_parent"
????android:layout_height="match_parent"
????android:keepScreenOn="true">
????...
</RelativeLayout>


? ? ? 使用android:keepScreenOn="true"和使用?FLAG_KEEP_SCREEN_ON是一樣的,你可以選擇較適合的一種。在Activity設置的好處是可以清除?FLAG_KEEP_SCREEN_ON標志,關閉屏幕。

? ? ? 注意:正常情況下,你是不需要清除?FLAG_KEEP_SCREEN_ON標志的,除非你不想屏幕在應用還運行時保持亮起(比如程序有一段時間都沒有發生活動,你想把屏幕關閉)。當你的APP跑到后臺或恢復前臺時,Window?manager會進行相應的設置。但是如果你想顯式地進行清除這個標志,關閉屏幕,可以使用clearFlag():

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON).


2.保持CPU運行

? ? ?有時候為了在設備休眠之前能完成一些工作,必須保持CPU運行。你可以使用一個PowerManager系統服務特性——WakeLock實現。Wakelock允許APP控制設備的電源狀態。

? ? ?創建并持有Wakelock對設備電池壽命有很大影響。所以你應該在確實很必要的時候才使用,且使用時間盡可能少。比如在Acitivity中就沒必要用了,如前面所述,可以使用FLAG_KEEP_SCREEN_ON標志。

? ? ?使用WakeLock一個合適的例子就是,當屏幕關閉的時候,后臺服務中需要持有WakeLock來保持CPU運行,以繼續完成工作。但還是那句話,應盡量避免WakeLock的使用,否則會影響電池壽命。

? ? ?使用WakeLock的第一步就是在應用的manifest文件中添加WAKE_LOCK權限

<uses-permission?android:name="android.permission.WAKE_LOCK"?/>

? ? ? 如果你的APP包含有broadcast?Receiver,且在broadcast?Receiver中開啟了服務去完成一些工作,那么可以通過?WakefulBroadcastReceiver來管理WakeLock,下面將會講述,這是我們推薦的方法,如果你的APP不符合這個模式,下面是直接設置WakeLock的方法:

PowerManager?powerManager?=?(PowerManager)?getSystemService(POWER_SERVICE);
Wakelock?wakeLock?=?powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
????????"MyWakelockTag");
wakeLock.acquire();

? ? ? 調用wakelock.release()來釋放WakeLock,這會釋放CPU。當你的APP執行完成時不要忘了釋放WakeLock,這樣能避免消耗電池。


3.使用WakefulBroadcastReceiver

? ? ? 使用Broadcast?Receiver和service能讓你很好地管理后臺任務的生命周期。

? ? ? WakefulBroadcastReceiver是BroadcastReceiver的一種特例。它會為你的APP創建和管理一個PARTIAL_WAKE_LOCK?類型的WakeLock。WakefulBroadcastReceiver把工作交接給service(通常是IntentService),并保證交接過程中設備不會進入休眠狀態。如果不持有WakeLock,設備很容易在任務未執行完前休眠。最終結果是你的應用不知道會在什么時候能把工作完成,相信這不是你想要的。

? ? ? 像其他BroadcastReceiver使用WakefulBroadcastReceiver的第一步就是把它加到manifest中:

<receiver?android:name=".MyWakefulReceiver"></receiver>


? ? ? 下面的代碼通過startWakefulService()開啟MyIntentService,該方法和?startService()相似,不同之處在于WakefulBroadcastReceiver會在服務開啟的時候持有一個WakeLock。startWakefulService傳遞的intent封裝了WakeLock的標識符。

public?class?MyWakefulReceiver?extends?WakefulBroadcastReceiver?{

????@Override
????public?void?onReceive(Context?context,?Intent?intent)?{

????????//?Start?the?service,?keeping?the?device?awake?while?the?service?is
????????//?launching.?This?is?the?Intent?to?deliver?to?the?service.
????????Intent?service?=?new?Intent(context,?MyIntentService.class);
????????startWakefulService(context,?service);
????}
}

? ? ? 當服務結束的時候,會調用?MyWakefulReceiver.completeWakefulIntent()釋放WakeLock,completeWakefulIntent的參數是WakefulBroadcastReceiver傳來的intent:

public?class?MyIntentService?extends?IntentService?{
????public?static?final?int?NOTIFICATION_ID?=?1;
????private?NotificationManager?mNotificationManager;
????NotificationCompat.Builder?builder;
????public?MyIntentService()?{
????????super("MyIntentService");
????}
????@Override
????protected?void?onHandleIntent(Intent?intent)?{
????????Bundle?extras?=?intent.getExtras();
????????//?Do?the?work?that?requires?your?app?to?keep?the?CPU?running.
????????//?...
????????//?Release?the?wake?lock?provided?by?the?WakefulBroadcastReceiver.
????????MyWakefulReceiver.completeWakefulIntent(intent);
????}
}



與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的关于定时执行任务的解决方法,PendingIntent alarm braocastRecevier等等的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。