如何设置活动始终处于活动状态?
我有需要一直活跃的活动。我有睡眠10秒的线程,并监视从数据库中取得的值,比较它们并启动方法。我想知道如果用户回到其他应用程序和活动,我的活动和线程仍然工作,或者他们由活动经理处理,并去暂停,停止销毁?如何让他们现场? 谢谢。 这里是线程代码:如何设置活动始终处于活动状态?
new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
while(true){
try {
Thread.sleep(10000);
myHendler.post(new Runnable() {
public void run() {
// TODO Auto-generated method stub
final Calendar cal = Calendar.getInstance();
int godina2 = cal.get(Calendar.YEAR);
int mesec2 = cal.get(Calendar.MONTH);
int dan2 = cal.get(Calendar.DAY_OF_MONTH);
int sati2 = cal.get(Calendar.HOUR_OF_DAY);
int minuti2 = cal.get(Calendar.MINUTE);
trenutniDatum = new StringBuilder().append(dan2).append("-").append(mesec2 +1).append("-").append(godina2);
trenutnoVreme = prepraviVreme(sati2) + ":" + prepraviVreme(minuti2);
for(int i = 0; i < primljenoIzBazeDatum.length; i++){
String bazaBroj = "";
String bazaText = "";
if(primljenoIzBazeDatum[i].toString().equals(trenutniDatum.toString()) && primljenoIzBazeVreme[i].toString().equals(trenutnoVreme)){
int bazaId = Integer.parseInt(primljenoIzBazeId[i]);
bazaBroj = primljenoIzBazeBroj[i].toString();
bazaText = primljenoIzBazeText[i].toString();
String datumPromena = "*" + primljenoIzBazeDatum[i].toString() + "* SENT *";
datumVreme.open();
datumVreme.updateData(bazaId, datumPromena);
datumVreme.close();
sendPoruka(bazaBroj, bazaText);
}
} // end for
} // end run
});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
根据我对你想做的事了解了,这里是我会做什么:
首先,创建一个BroadcastReceiver
public class Poller extends BroadcastReceiver {
private final String TAG = "Poller";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Poller broadcastintent received");
Intent myIntent = new Intent(context, PollerService.class);
context.startService(myIntent);
}
然后,创建一个名为服务,然后关闭本身下来
public class PollerService extends Service {
final String TAG = "PollerService";
@Override
public void onStart(Intent intent, int startId) {
Log.i(TAG, "Service onStart()");
pollingTask.execute();
}
AsyncTask<Void, Void, Void> pollingTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... param) {
// Do what you want in the background
}
@Override
protected void onPostExecute(Void result) {
stopSelf();
}
};
}
然后,设置AlarmManager唤醒服务每分钟
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent("CHECK_DATABASE");
PendingIntent pi = PendingIntent.getBroadcast(context, 0 , alarmIntent, 0);
int type = AlarmManager.ELAPSED_REALTIME_WAKEUP;
long interval = POLLING_INTERVAL_IN_MILLISECONDS;
long triggerTime = SystemClock.elapsedRealtime() + interval;
// For short intervals setInexact repeating is same as exactRepeating, use at least fifteen minutes to make it more efficient
am.setInexactRepeating(type, triggerTime, interval, pi);
Log.i(TAG, "Set inexact alarm through AlarmManager");
}
设置在Android上的接收器表现
<receiver android:name="Poller">
<intent-filter>
<action android:name="CHECK_DATABASE"/>
</intent-filter>
</receiver>
最后,当你需要的短信收到
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent("CHECK_DATABASE");
PendingIntent pi = PendingIntent.getBroadcast(context, 0 , intent, 0);
am.cancel(pi);
我认为彼得是正确的,虽然,这将取消设置AlarmManager停止轮询杀死你的电池,除非你只会在你得到所需的信息之前进行检查,然后不进行民意调查,这是一个很短的时间。
此外,如果您想从数据库以单个呼叫发送短信的确切时间,您可以设置AlarmManger来唤醒当时的服务,执行操作并完成它。这将是最好的方法(如果这是你的代码的情况,我不能完全确定,但它确实似乎来自你的评论)。
如果它必须是积极的,所有您需要使用服务时间:http://developer.android.com/guide/topics/fundamentals/services.html
我想知道如果用户返回到其他应用程序和活动, 做我的活动和线程仍然工作,或他们由 活动经理处理,并去暂停,停止销毁?如何保持他们 现场?
他们不会被保持“活着”。如果系统需要资源,您的活动将被破坏。如果你想让应用程序完成后仍能在后台运行,你必须使用服务。
服务可能会被系统中止,并不能保证一直运行。当设备处于睡眠模式时,它们肯定不会被执行。 – 2012-02-12 10:32:44
您可以确保它们在onStartCommand()方法中尽可能快地运行某些返回语句。 – ezcoding 2012-02-12 11:06:08
不,没有应用程序代码在Android上不能保证一直运行。 Android操作系统可以在任何需要的时候关闭应用程序和服务。
定期执行代码的最佳方法是使用AlarmManager,这会使您的代码定期执行。当设备睡着时,还必须设置一个适当的标志来执行你的代码。
请注意,由于您的期限非常短(10秒),因此它会一直保持CPU运行状态,从而很快耗尽电池。
我可以在1分钟内改变这一点。我的应用程序必须在用户输入的日期和时间内发送短信,这就是为什么我需要每分钟检查一次。 – Wolf87 2012-02-12 10:36:48
在Java语言中,你可以通过传统的方式安排你的计划:
java.util.Timer
java.util.TimerTask
获取更多信息,您可以看到:
- http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html
- http://www.ibm.com/developerworks/java/library/j-schedule/index.html
,但更好的做法正在使用一个调度框架如石英,你可以看到http://www.quartz-scheduler.org/。 Spring框架也与Quartz框架集成。
您是否考虑过使用服务? – 2012-02-12 10:22:26
我刚刚读到它,你能给我一些有用的建议吗? – Wolf87 2012-02-12 10:28:19
我会和@ PeterKnego的答案一起去。你可以澄清,如果你的意思是在手机睡着的时候? – 2012-02-12 10:41:04