android关于轮询的一种解决方案
2016-05-07 11:40
465 查看
前段时间,由于公司项目中某个功能需要用到轮询的操作,所以参考了网上的一些资料,做了一个demo。主要方案是:AlarmManager + BroadcastReceiver
+ Service
首选需要获取AlarmManager,并包装要执行的服务:
然后是在activity中调用:
+ Service
首选需要获取AlarmManager,并包装要执行的服务:
/** * 开始轮询 */ public static void startPolling(Context context, int seconds, Class<?> cls, String action) { //获取AlarmManager系统服务 AlarmManager manager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); //包装需要执行Service的Intent Intent intent = new Intent(context, cls); intent.setAction(action); PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //触发服务的起始时间 long triggerAtTime = SystemClock.elapsedRealtime(); //使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime, seconds * 1000, pendingIntent); } /** * 停止轮询服务 */ public static void stopPolling(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); //取消正在执行的服务 manager.cancel(pendingIntent); }然后我们需要在服务中执行获取数据的操作:
@Override public int onStartCommand(Intent intent, int flags, int startId) { thread = new Thread(new Runnable() { @Override public void run() { Intent intent = new Intent(); intent.setAction("CustomBroadcastReceiver"); intent.putExtra("data",++i); sendBroadcast(intent); } }); thread.start(); return super.onStartCommand(intent, flags, startId); }在广播中,我定义了一个回调。广播接收到数据后,会执行回调,把数据传给activity:
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(auctionListener == null) { Toast.makeText(context,"监听器为空",Toast.LENGTH_SHORT).show(); return; }else { auctionListener.onUpdataAction(msg.what); } } }; @Override public void onReceive(Context context, Intent intent) { this.context = context; Message message = handler.obtainMessage(); message.what = intent.getIntExtra("data",0); handler.sendMessage(message); }不过有一个问题,我明明在activity中设置了回调,仍然会执行监听器为空的操作,不明白为什么。知道的麻烦,回复一下,到底是什么原因?
然后是在activity中调用:
<span style="font-size:14px;"> @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.text); receiver = new CustomBroadcastReceiver(); receiver.setOnAuctionListener(this); IntentFilter intentFilter = new IntentFilter(CustomBroadcastReceiver.ACTION); registerReceiver(receiver,intentFilter); PollingUtils.startPolling(this,1,MyService.class,MyService.ACTION); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); PollingUtils.stopPolling(this,MyService.class,MyService.ACTION); } @Override public void onUpdataAction(int data) { textView.setText(data+""); }</span>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories