Ⅰ android8 後台定時提醒通知
個推文檔要求必須聲明一個名為pushservice的後台進程,親測應用被殺後依然存活,但系統重啟無效。
在後台進程中創建一個定時器,我這里使用的是Rxjava,創建了一個每隔1分鍾就執行一次的定時任務。
需要注意的是,這里創建的是一個後台 進程,進程 ...和當前進程不一樣的進程,在這個獨立的進程中,不可以使用應用進程中的全局變數氏派,否則會森陸產生空指針異常。比如取Application就是空。當然,你可以使用跨進程通信的方法解決。
我這里是利用這個進程每隔一分鍾啟動了一個IntentService,以startForegroundService的方式,這也是谷歌的要求。然後在IntentService里可以訪問應用app的資源。我這里是在IntentService里檢查相關的條件是否滿足,如果滿足,就彈出一條通知提醒用戶。看到這里你肯定要問,startForegroundService的此核頃方式必須調用startForeground顯式彈出一個通知,如果不滿足條件或者我就是不想彈任何通知,只是想偷偷的做一些後台任務呢?原則上谷歌是不允許這么做的,但是奈何任何系統都有bug,而我發現了一個可以避免彈通知的方法....
Android8 避免startForeground方法彈出通知
利用上面所述,你應該可以實現自己的後台任務了。
Ⅱ android中執行定時任務的幾種方式
創建線程,倒計時和正計時都可以喚罩(在線程中睡眠就好了,到指定的時候再觸發)
handler輕量級線程,循環操作,這個可和缺鬧以參考網頁鏈扮穗接
Ⅲ Android 後台定時任務有幾種實現方式
123456789ignore_user_abort();//關掉瀏覽器,PHP腳枝鎮本也可以繼續執行.<a href="/s?wd=set_time_limit&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-" target="_blank" class="-highlight"纖手>set_time_limit</a>(0);// 通過<a href="/s?wd=set_time_limit&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-" target="_blank" class="-highlight">set_time_limit</a>(0)可以讓程序無限制的執行下去$interval=60*30;// 每隔半小時運行do{ //ToDo sleep($interval);// 等待5分鍾}while(true); 簡單直接不毀搭嫌顧後果型
Ⅳ android怎麼實現定時任務
import javax.swing.*;
import java.awt.*;
public class Problem extends JFrame{
//公用
ImageIcon proII;
JLabel proJL;
JPanel proJP;
JPanel proJP1_1;
JLabel proJL1_1;
JRadioButton projrb1_1,projrb1_2,projrb1_3;
ButtonGroup proBG1_1;
JButton proJB1_1;
Ⅳ android怎麼實現定時的操作
有時候我們會遇到定時打開某些應用的這樣一種需求。
比如最近我在使用讀者 Android版的應用的時候,每次打開應用,應用發送一定的聯網請求之後就可以給我的賬號增加一定的積分,連續登錄的次數越多,積分獎勵越多。而一旦有一天沒有登錄,積分獎勵又從最初的值開始。
為了避免某一天忘記打開應用或者應用打開後聯網需要等待一段時間,可以通過定時達人這款手機應用定時地打開其它應用。
工具/原料
Android手機(我手機目前系統版本是4.2.2)
定時達人(TimeDo)
讀者 Android應用
方法/步驟
在手機上安裝定時達人軟體
定時達人有自己的網站,相關應用在各大應用商城也有。可以通過apk進行安裝,可以從應用商店下載安裝。我是從散配google play上下載安裝的。
添加新任務
設置任務困隱——設置時間
設置任務——給任務取個名字
設置任務——添加新任務
選擇運行程序一欄
設置任務——選擇定時打開的應用程序
點擊應用程序,選擇讀者。
保存設置
這汪掘廳里需要點兩次保存,之後就回到了定時達人主頁面。
通過立即執行進行測試設置效果
單擊定時打開讀者一欄,在彈出下拉框中選擇立即執行來立即執行任務。在設置正確的情況下讀者應用被打開,通知欄會有相應通知提示。
在之前的設置步驟中,保持了默認的循環方式,即周循環,一周的每一天都選中。按照設置,每一天的指定時間都可以自動打開相應應用。
Ⅵ android 怎麼實現後台注冊一個service,定時定位的功能
public class ServiceLocationGPS extends Service implements AMapLocationListener {
private GlobalApp app;
private LocationManagerProxy aMapLocManager = null;
private AMapLocation aMapLocation;// 用於清爛判斷定位敗槐超時
public Timer timer;
TimerTask task;
public Integer period = 10;
public Integer count = 0;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
app = (GlobalApp) getApplication();
start();
super.onCreate();
}
@Override
public void onDestroy() {
stoptime();
super.onDestroy();
}
@Override
@Deprecated
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
public void startLocation() {
if (aMapLocManager == null) {
aMapLocManager = LocationManagerProxy
.getInstance(ServiceLocationGPS.this);
System.out.println("startLocation");
aMapLocManager.requestLocationUpdates(
LocationProviderProxy.AMapNetwork, -1, 10, this);
} else {
aMapLocManager.requestLocationUpdates(
LocationProviderProxy.AMapNetwork, -1, 10, this);
}
public void start() {
initSchele();
// 10秒以後啟動任務;
startSchele(10);
}
@Override
public void onLocationChanged(AMapLocation location) {
if (location != null) {
this.aMapLocation = location;// 判斷超察正友時機制
Double geoLat = location.getLatitude();
Double geoLng = location.getLongitude();
String cityCode = "";
String desc = "";
Bundle locBundle = location.getExtras();
if (locBundle != null) {
cityCode = locBundle.getString("citycode");
desc = locBundle.getString("desc");
}
System.out.println("onLocationChanged," + geoLat + "," + geoLng);
// aMapLocManager.removeUpdates(this);
//stopLocation();
}
}
/**
* 銷毀定位
*/
public void stopLocation() {
if (aMapLocManager != null) {
aMapLocManager.removeUpdates(this);
aMapLocManager.destory();
}
aMapLocManager = null;
}
/**
* 開啟定時任務;
*/
public void startSchele(int delay) {
if (timer != null && task != null)
// 10秒以後執行任務;
timer.schele(task, delay * 1000, period * 1000);
}
public void initSchele() {
if (timer == null)
timer = new Timer();
if (task == null)
task = new TimerTask() {
@Override
public void run() {
startLocation();
}
};
}
private void stoptime() {
if (timer != null) {
timer.cancel();
timer = null;
}
if (task != null) {
task.cancel();
task = null;
}
}
}
Ⅶ android定時器的使用
目前在項目中使用過的定時器主要是兩種方式:1.handler的延時任務 2.timer的定時器
下面主要來介紹這兩種方式 定時器的用法,和遇到的坑 :
1.handler的延時任務
寫了一個demo,是關於hanlder發送延時消息和 取消延時消息的
但是在實際運用的過程中,常常會出現無法移除延時消息的問題,這個問題主要是因為兩個runnable的對象不是同一個,
當Activity進入後台運行後再轉入前台運行,removeCallbacks無法將updateThread從message queue中移除。這是為什麼呢?
在Activity由前台轉後台過程中,線程是一直在運行的,但是當Activity轉入前台時會重新定義Runnable runnable;也就是說此時從message queue移除的runnable與原先加入message queue中的runnable並非是同一個對象。 解決方式1:如果把runnable定義為靜態的則removeCallbacks不會失效,對於靜態變數在內存中只有一個拷貝(節省內存),JVM只為靜態分配一次內存,在載入類的過程中完成靜態變數迅洞的內存分配,我們做如下修改就能解決上面的這個問題.
解決方式2:將所有的runnable任務放到一個集合中,根據runnable的id移除相應的任務,即可以解決這個問題
2.timer的延時任務
同樣用上面的demo來說明使用方法:
要注意的是:
TimerTask運行在一個單獨的線程里,而不是UI線程。所以使用 Android timer時,注意android的單線程原則,確保線程安全。不要纖物在TimerTask的run方法中做UI相關的操作,如:TextView.setText()等,這樣可能會導致UI線程阻塞。如果需要可以使用handler向UI線程發消息,具體處理由UI線程自己完成。在使用完Timer之後,要使用Timer的cancel方法取消Timer,否則Timer一直在運行。
這里需要注畝豎枯意的是,timer的cancel方法只能執行一次,不能在調用了cancel之後再進行timer的任務執行。
參考文章:
Android 定時器實現的幾種方式和removeCallbacks失效問題詳解
Android 中Timer和TimeTask完成定時任務
Ⅷ Android 後台任務執行
參考:
手機休眠引發的「血案」
使設備保持喚醒
目的為了後台能夠執行定時任務,避免因為設備息屏等操作導致CPU進入睡眠狀態,定時任務被暫停,這就需要能夠喚醒CPU,使CPU能夠起來工作
具有喚醒CPU功能, 喚醒CPU與喚醒屏幕非同一功能。
AlarmManager是安卓系統封裝的用於管理RTC 模塊,RTC(實時時鍾)是一個獨立的硬體時鍾,可以在CPU休眠時正常運行,在預設的時間到達時,通過中斷喚醒CPU。這意味著,岩槐亮如果我們用AlarmManager來定時執行任務,CPU可以正常的休眠,只有在需要運行任務時醒來一段很短的時間。
AlarmManager 定時任務測試粗寬:
MI8 UD:
測試1: 創建一個 Service, Service 中啟動一個 AlarmManager 定時任務
息屏後會繼續列印Log,但息屏超過1min 後,log 停止輸出:
測試2: 創建一個前台通知Service
Service + StartForground + 前台通知 方式,
MI8 UD 息屏後仍繼續列印log.
MI 8 + MI 10 經過測試,在長時間息屏狀態下, AlarmManager 也會存在不工作情況。
另外,設備處於低電耗模式下, AlarmManager 會停止工作或延遲工作,解決辦法: AlarmManager 利弊
手機長時間不操作,CPU 就會進入睡眠狀態,會導致 Timer 中的定時任務無法正常運行。
息屏後,TimerTask 停止工作,再次亮屏後,繼續工作
同樣會由於息屏導致CPU睡眠, Handler 停止工作
太「重」了,使用起來。 影響設備耗電量。
WorkManager 也可以運行後台任務,用於在APP進程被kill後,系統依然可以運行的任務,不要用於APP被殺後,後台服務即停止的任務。
總結:
Timer並不太適用於那些需要長期在後台運行的定時任務。為了能讓電池更加耐用,每種手機都會有自己的休眠策略,Android 手機就會在長時間不操作的情況下自動讓 CPU 進入到睡眠狀態,這就有可能導致 Timer 中的定時任務無法正常運行。
Alarm具有喚醒 CPU 的功能,即可以保證每次需要執行定時任務的時明碧候 CPU 都能正常工作。
AlarmManager 定時任務最小間隔5S, 如何設置間隔 < 5s, 也是按照 5s 間隔執行。
Android DozeMode