java重复性后台任务Android处理程序与AlarmManager
我正在研究一份申请。我们希望跟踪手机上的一些用户活动:如果广播接收器很容易检测到某些操作,我们还希望检查当前正在运行的应用程序。 此应用程序仅适用于运行Android 5.0或更低版本的Android设备
我的问题是,我在一个处理程序中发布了一个Runnable Obj,Runnable在半秒后再次在处理程序中发布自己(有关详细信息,请参阅代码)。在runnable中,我获取信息并将其发送给IntentService来执行工作
一切正常:应用程序在启动时启动,handler和runnable在后台完成它们的工作,除非我打开主活动。 该应用程序可以持续运行数天,但如果我打开主活动,然后通过滑动“最近打开的活动”或内存任务管理器、处理程序和runnable stop将其关闭,即使活动没有调用/访问它们(它们在单独的服务中)。 此外,并不总是调用onDestroy(活动或服务)。 在网上阅读时,我了解到滑动或任务管理器会将应用程序从内存中同时删除,因此并不总是调用onDestory
我想要实现的是,在主活动结束后不久,让处理程序重新启动
我尝试过的是在活动的Pause方法中加入一些检查,确保在再次调用onStart时(比如应用程序从垂直布局切换到水平布局,或者如果按下home按钮,然后再次打开应用程序)删除此检查。还实现了一种让处理程序向广播接收器发送“ImAlive”意图的方法,如果意图在倒计时结束前未到达,广播接收器应重新启动启动处理程序的服务。不幸的是,一旦主活动停止,就连广播也会自动取消注册并销毁
我的问题是,有没有一种方法可以在活动关闭时创建能够让我的处理程序重新启动的东西?或者有没有其他模式可以帮助我解决我想要实现的目标?因为我每隔半秒就轮询一次数据,所以最好使用处理程序,因为计时器会将小间隔扩大到更大的间隔,而AlarmManager对于非常小的间隔不够精确
我想要实现的是类似于Facebook、Instagram、Whatsapp、Telegram应用的东西,它们总是在内存中,即使你强制终止它们,几秒钟后它们又会回到那里。。。怎么做
由于连续轮询数据,我们对电池问题不感兴趣。出于研究目的,我们不介意我们测试的手机是连续两天、一天还是12小时或更短
这里的代码是:OnBootService从广播接收器启动,在接收到onBootCompleted和ShutDown操作时在清单中声明,以便启动和停止处理程序
public class OnBootService extends Service{
private static final Handler handler = new Handler();
private final long HALF_SEC = 500;
private RunnableTest r = null;
private Context myContext = this;
private final String TAG = "BootService";
// Extras
public static final String START = "start";
public static final String STOP = "stop";
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public int onStartCommand(Intent intent, int flag, int startId){
String action = intent.getAction();
switch(action){
case START: startHandler();
break;
case STOP: stopHandler();
break;
}
return START_NOT_STICKY;
}
private void startHandler(){
if(r == null){
r = new RunnableTest();
handler.post(r);
Log.i(TAG, "----Handler started!");
}
}
private void stopHandler(){
if(r != null){
Log.i(TAG, "----calling STOP");
handler.removeCallbacks(r);
r = null;
}
}
private class RunnableTest implements Runnable {
private String TAG = "RunnableTest";
public RunnableTest(){}
@Override
public void run(){
handler.removeCallbacks(this);
// Do stuff
Intent i = new Intent(myContext, MyIntentService.class);
i.putExtra("addStuff", myStuff);
myContext.startService(i);
handler.postDelayed(this, HALF_SEC);
}
}
Activity为空:重写所有方法只是为了理解适当的活动生命周期,但else暂时为空
public class MainActivity extends AppCompatActivity {
private final String TAG = "Activity";
private Context myContext = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// access a file and get stored information to show
setContentView(R.layout.activity_main);
Toast.makeText(getBaseContext(), "Application open successfully", Toast.LENGTH_LONG).show();
}
@Override
protected void onRestart(){
super.onRestart();
Log.e(TAG, "----onRestart Called");
}
@Override
protected void onStart(){
super.onStart();
Log.e(TAG, "----onSTART Called");
}
@Override
protected void onResume(){
super.onResume();
Log.e(TAG, "----onRESUME Called");
}
@Override
protected void onPause(){
super.onPause();
Log.e(TAG, "----onPAUSE Called");
}
@Override
protected void onStop(){
super.onStop();
Log.e(TAG, "----onSTOP Called");
}
@Override
protected void onDestroy(){
super.onDestroy();
Log.e(TAG, "----onDestroy Called");
}
}
非常感谢您的帮助,如果您需要更多关于代码的信息,我将更新帖子。 谢谢!
共 (0) 个答案