如何设置活动始终处于活动状态?

问题描述:

我有需要一直活跃的活动。我有睡眠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(); 
+0

您是否考虑过使用服务? – 2012-02-12 10:22:26

+0

我刚刚读到它,你能给我一些有用的建议吗? – Wolf87 2012-02-12 10:28:19

+0

我会和@ PeterKnego的答案一起去。你可以澄清,如果你的意思是在手机睡着的时候? – 2012-02-12 10:41:04

根据我对你想做的事了解了,这里是我会做什么:

首先,创建一个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来唤醒当时的服务,执行操作并完成它。这将是最好的方法(如果这是你的代码的情况,我不能完全确定,但它确实似乎来自你的评论)。

+0

是的,AlarmManager可以工作。 谢谢soooo,我会组织我的代码,以便在需要发送短信时才醒来。 – Wolf87 2012-02-12 11:24:35

+0

不用担心。祝你好运 !! – 2012-02-12 11:32:32

+0

只是还有一个问题,在我的数据库中我有日期和时间字段中的字符串,我怎么能以毫秒为单位进行更改,所以到现在何时设置AlarmManager? 也许可以在数据库中添加一列,并且当用户将日期和时间以毫秒为单位进行更改并稍后使用它时? – Wolf87 2012-02-12 11:35:14

如果它必须是积极的,所有您需要使用服务时间:http://developer.android.com/guide/topics/fundamentals/services.html

我想知道如果用户返回到其他应用程序和活动, 做我的活动和线程仍然工作,或他们由 活动经理处理,并去暂停,停止销毁?如何保持他们 现场?

他们不会被保持“活着”。如果系统需要资源,您的活动将被破坏。如果你想让应用程序完成后仍能在后台运行,你必须使用服务。

+0

服务可能会被系统中止,并不能保证一直运行。当设备处于睡眠模式时,它们肯定不会被执行。 – 2012-02-12 10:32:44

+0

您可以确保它们在onStartCommand()方法中尽可能快地运行某些返回语句。 – ezcoding 2012-02-12 11:06:08

不,没有应用程序代码在Android上不能保证一直运行。 Android操作系统可以在任何需要的时候关闭应用程序和服务。

定期执行代码的最佳方法是使用AlarmManager,这会使您的代码定期执行。当设备睡着时,还必须设置一个适当的标志来执行你的代码。

请注意,由于您的期限非常短(10秒),因此它会一直保持CPU运行状态,从而很快耗尽电池。

+1

我可以在1分钟内改变这一点。我的应用程序必须在用户输入的日期和时间内发送短信,这就是为什么我需要每分钟检查一次。 – Wolf87 2012-02-12 10:36:48

在Java语言中,你可以通过传统的方式安排你的计划:

java.util.Timer 
java.util.TimerTask 

获取更多信息,您可以看到:

  1. http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html
  2. http://www.ibm.com/developerworks/java/library/j-schedule/index.html

,但更好的做法正在使用一个调度框架如石英,你可以看到http://www.quartz-scheduler.org/。 Spring框架也与Quartz框架集成。