2012-02-12 149 views
1

我有需要一直活躍的活動。我有睡眠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

回答

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 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

0

如果它必須是積極的,所有您需要使用服務時間: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

3

不,沒有應用程序代碼在Android上不能保證一直運行。 Android操作系統可以在任何需要的時候關閉應用程序和服務。

定期執行代碼的最佳方法是使用AlarmManager,這會使您的代碼定期執行。當設備睡着時,還必須設置一個適當的標誌來執行你的代碼。

請注意,由於您的期限非常短(10秒),因此它會一直保持CPU運行狀態,從而很快耗盡電池。

+1

我可以在1分鐘內改變這一點。我的應用程序必須在用戶輸入的日期和時間內發送短信,這就是爲什麼我需要每分鐘檢查一次。 – Wolf87 2012-02-12 10:36:48

相關問題