Android 轮询最佳实践 Service + AlarmManager
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
雖然alarm的意思是鬧鐘,而且在原生android自帶的鬧鐘應(yīng)用中AlarmManager也確實非常重要,但并不代表AlarmManager只是用來做鬧鐘應(yīng)用的,作為一個一種系統(tǒng)級別的提示服務(wù),肯定應(yīng)該有著非常重要的地位,實際上android中很多東西都可以利用AlarmManager來實現(xiàn)。
AlarmManager在特定的時刻為我們廣播一個指定的Intent。簡單的說就是我們設(shè)定一個時間,然后在該時間到來時,AlarmManager為我們廣播一個我們設(shè)定的Intent。這個intent可以指向一個activity,也可以指向一個service。
下面就是使用alarm定時調(diào)用service實現(xiàn)輪詢的實現(xiàn)方法:
一、新建輪詢工具類PollingUtils.java
?
public class PollingUtils {//開啟輪詢服務(wù)public static void startPollingService(Context context, int seconds, Class<?> cls,String action) {//獲取AlarmManager系統(tǒng)服務(wù)AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);//包裝需要執(zhí)行Service的IntentIntent intent = new Intent(context, cls);intent.setAction(action);PendingIntent pendingIntent = PendingIntent.getService(context, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);//觸發(fā)服務(wù)的起始時間long triggerAtTime = SystemClock.elapsedRealtime();//使用AlarmManger的setRepeating方法設(shè)置定期執(zhí)行的時間間隔(seconds秒)和需要執(zhí)行的Servicemanager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime,seconds * 1000, pendingIntent);}//停止輪詢服務(wù)public static void stopPollingService(Context context, Class<?> cls,String action) {AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);Intent intent = new Intent(context, cls);intent.setAction(action);PendingIntent pendingIntent = PendingIntent.getService(context, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);//取消正在執(zhí)行的服務(wù)manager.cancel(pendingIntent);} }?二、構(gòu)建輪詢?nèi)蝿?wù)執(zhí)行PollingService.java
?
?
public class PollingService extends Service {public static final String ACTION = "com.ryantang.service.PollingService";private Notification mNotification;private NotificationManager mManager;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {initNotifiManager();}@Overridepublic void onStart(Intent intent, int startId) {new PollingThread().start();}//初始化通知欄配置private void initNotifiManager() {mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);int icon = R.drawable.ic_launcher;mNotification = new Notification();mNotification.icon = icon;mNotification.tickerText = "New Message";mNotification.defaults |= Notification.DEFAULT_SOUND;mNotification.flags = Notification.FLAG_AUTO_CANCEL;}//彈出Notificationprivate void showNotification() {mNotification.when = System.currentTimeMillis();//Navigator to the new activity when click the notification titleIntent i = new Intent(this, MessageActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i,Intent.FLAG_ACTIVITY_NEW_TASK);mNotification.setLatestEventInfo(this,getResources().getString(R.string.app_name), "You have new message!", pendingIntent);mManager.notify(0, mNotification);}/*** Polling thread* 模擬向Server輪詢的異步線程* @Author Ryan* @Create 2013-7-13 上午10:18:34*/int count = 0;class PollingThread extends Thread {@Overridepublic void run() {System.out.println("Polling...");count ++;//當(dāng)計數(shù)能被5整除時彈出通知if (count % 5 == 0) {showNotification();System.out.println("New message!");}}}@Overridepublic void onDestroy() {super.onDestroy();System.out.println("Service:onDestroy");} }?三、AndroidManifest.xml 配置
?
?
<!--服務(wù)配置--><serviceandroid:name="com.ryantang.service.PollingService"android:exported="false"><intent-filter><action android:name="com.ryantang.service.PollingService" /></intent-filter></service>?四、在MainActivity.java中開啟和停止PollingService
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//Start polling serviceSystem.out.println("Start polling service...");PollingUtils.startPollingService(this, 5, PollingService.class, PollingService.ACTION);}@Overrideprotected void onDestroy() {super.onDestroy();//Stop polling serviceSystem.out.println("Stop polling service...");PollingUtils.stopPollingService(this, PollingService.class, PollingService.ACTION);} }?
?
轉(zhuǎn)載于:https://my.oschina.net/huqiji/blog/804866
總結(jié)
以上是生活随笔為你收集整理的Android 轮询最佳实践 Service + AlarmManager的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: error-2016-2-15
- 下一篇: Android 工程的创建