您的位置:首页 > 其它

Service与AlarmManager-BroadcastReceiver能否在CPU沉睡下工作

2013-07-22 10:36 417 查看
项目中有两块需要用到这个

1 。 每隔5分钟定位一次位置,提交给接口

2.. 每隔5分钟提交一次代传记录,就是用户提交缓存在本地的数据

第一种方式:起初我用的Service,然后用的while 死循环,不断每隔5分钟 去执行一次

但是 有时候位置有时候很久不提交,特别是晚上,后来分析了一下, Service会随着cpu的休眠而沉睡

@Override

public void onCreate() {

super.onCreate();

customization=Customization.getInstance(this);

submittingThread = new Thread(new Runnable() {

@Override

public void run() {

while (true) {

try {

submitCardData(); //提交字符表

submitCardFileData();//提交文件表

Thread.sleep(5*60* 1000); // 5分钟执行一次提交

} catch (InterruptedException e1) {

e1.printStackTrace();

}

}

}

}

);

submittingThread.start();

}

第二种方式:启动程序的时候 调用一下 startReceiver(),AlarmManager 能在cpu休眠的时候继续工作

public class SchedulePositionReceiverController {

String Tag="SchedulePositionReceiverController";

Activity activity;

private static SchedulePositionReceiverController instance;

public SchedulePositionReceiverController(Activity activity) {

this.activity=activity;

}

public static SchedulePositionReceiverController getInstance(Activity activity){

if(instance==null){

return new SchedulePositionReceiverController(activity);

}

return instance;

}

/***

* 启动Receiver

*/

public void startReceiver() {

//启动SubmitReceiver..0.....0

Intent intent =new Intent(activity,SchedulePositioningReceiver.class);

intent.setAction("SchedulePositioningReceiver");

PendingIntent sender=PendingIntent

.getBroadcast(activity, 0, intent, 0);

//开始时间

long firstime=SystemClock.elapsedRealtime();

AlarmManager am=(AlarmManager)activity.getSystemService(Context.ALARM_SERVICE);//5分钟一个周期,不停的发送广播

am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP , firstime,5*60*1000, sender);

Log.e(Tag, "Customization.getInstance(this).getSubmittingInterval()="+Customization.getInstance(activity).getSubmittingInterval());

}

/***

* 取消 Receiver

*/

public void cancelReceiver(){

Intent intent =new Intent(activity, SchedulePositioningReceiver.class);

intent.setAction("SchedulePositioningReceiver");

PendingIntent sender=PendingIntent.getBroadcast(activity, 0, intent, 0);

AlarmManager alarm=(AlarmManager)activity.getSystemService(Context.ALARM_SERVICE);

alarm.cancel(sender);

}

}

接受广播类

public class SchedulePositioningReceiver extends BroadcastReceiver {

String TAG = "SchedulePositioningReceiver";

Context context;

Thread positioningThread;

@Override

public void onReceive(Context context, Intent intent) {

this.context = context;

mLocationClient = new LocationClient(context.getApplicationContext());

if (intent.getAction().equals("SchedulePositioningReceiver")) {

setLocationOption(); //提交位置代码 一些耗时工作,最好建一个Thread,BroadcastReceiver很容易超时,报无响应

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐