我有活动需要一直活跃.我有一个睡眠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();
Run Code Online (Sandbox Code Playgroud)
基于我对你想做什么的理解,我会做的是:
首先,创建一个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 );
}
Run Code Online (Sandbox Code Playgroud)
然后,创建被调用的服务然后自行关闭
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();
}
};
}
Run Code Online (Sandbox Code Playgroud)
然后,设置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");
}
Run Code Online (Sandbox Code Playgroud)
在Android清单中设置接收器
<receiver android:name="Poller">
<intent-filter>
<action android:name="CHECK_DATABASE"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
最后,取消设置收到所需短信后,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);
Run Code Online (Sandbox Code Playgroud)
我确实认为彼得是对的,除非你只是检查,直到你得到所需的信息,然后不进行民意调查,这将会杀死你的电池.
此外,如果您可以通过数据库中的单个调用获得发送SMS的确切时间,则可以设置AlarmManger以在此时唤醒服务,执行操作并完成操作.这将是最好的方法(如果您的代码就是这种情况,我无法理解,但它似乎确实来自您的评论).
| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |