我的活动一直需要活跃。我有一个睡眠10秒的线程,并监视从数据库中获取的值,比较它们和启动方法。我想知道用户是否回到其他应用程序和活动,我的活动和线程是否仍然有效,或者它们是由活动管理器处理并转到pause-stop-destroy?如何让他们活着? 谢谢。 这是该线程的代码:
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();
答案 0 :(得分:6)
根据我对你想做什么的理解,我会做的是:
首先,创建一个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
AlarmManager am = ( AlarmManager ) getSystemService( Context.ALARM_SERVICE );
Intent intent = new Intent( "CHECK_DATABASE" );
PendingIntent pi = PendingIntent.getBroadcast( context, 0 , intent, 0 );
am.cancel(pi);
我确实认为彼得是正确的,除非你只是检查,直到你得到所需的信息,然后不进行民意调查,这将会扼杀你的电池。
此外,如果您可以通过数据库中的单个调用获得发送SMS的确切时间,您可以设置AlarmManger以在此时唤醒服务,执行操作并完成操作。那将是最好的方法(如果您的代码就是这种情况,我无法理解,但它似乎确实来自您的评论)。
答案 1 :(得分:3)
不,Android上的应用程序代码无法保证始终运行。 Android操作系统可以在任何需要的时候终止应用程序和服务。
定期执行代码的最佳选择是使用AlarmManager,这会使您的代码定期执行。还必须设置正确的标志,以便在设备处于睡眠状态时执行代码。
注意,由于你的时间非常短(10秒),它会让CPU一直在运行,很快就会耗尽电池。
答案 2 :(得分:0)
如果必须一直处于活动状态,则必须使用服务:http://developer.android.com/guide/topics/fundamentals/services.html
我想知道用户是否回到其他应用程序和活动, 我的活动和线程是否仍然有效,或者它们是由...处理的 活动经理,然后去暂停 - 停止 - 破坏?如何留住他们 住??
他们不会被“活着”。如果系统需要资源,则会破坏您的活动。如果您希望在应用程序完成后仍然在后台运行,则必须使用服务。
答案 3 :(得分:0)
在Java语言中,您可以通过传统方式安排程序:
java.util.Timer
java.util.TimerTask
有关详细信息,请参阅:
但更好的做法是使用Quartz之类的调度框架,你可以看到http://www.quartz-scheduler.org/。 Spring框架还与Quartz框架集成。