2011-04-05 44 views
1

當我在Gmail客戶端收到一封電子郵件時,我想在GmailService類中運行方法CippaLippa()。服務工作幾個小時,比沒有更多的響應

我有一個接收器和AndroidManifest服務...

<receiver 
     android:name="com.myapp.receiver.GmailReceiver"> 
     <intent-filter> 
      <action 
       android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

    <service 
     android:name="com.myapp.service.GmailService" 
     android:label="@string/app_name" /> 

和這些類...

public class GmailReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, final Intent intent) { 


     final SharedPreferences preferences = context.getSharedPreferences("myapp.prefs", 0); 

     context.startService(new Intent(context, GmailService.class)); 
    } 
} 


public class GmailService extends Service { .. etc...} 

我的問題:一切正常,正確的幾個小時,當我收到來自Gmail的通知,CippaLippa()方法觸發......幾個小時後,當我收到gmail通知時,CippaLippa()方法不再觸發。

也許,有一種方法可以告訴GmailService類「保持活躍」並繼續監控Gmail事件嗎?我認爲這不是由於Android操作系統殺死未使用的類,因爲這是一個後臺服務,而不是一個活動。 我不知道。

回答

0

你說得對,系統殺死服務。我對與小部件關聯的服務有同樣的問題。 我通過每30分鐘左右刷新一次就解決了問題。

因此,如果您偶爾安排一些事件來喚醒您的服務,它應該保持運行。

雖然可能有更好的解決方案。

0

看看START_STICKY。我不確定這是否完全可以做到這一點,但它可能有助於保持您的服務。

+0

我在網上讀到這個技巧,理論上......但是,在實踐中,我通過這種方式閱讀了某人,之後,Android殺死了他的服務以釋放內存,服務重新加載......但之後6個小時!! – Geltrude 2011-04-05 07:59:27

1

以下代碼將立即啓動警報管理器(觸發PendingIntent)並每60秒運行一次任務。

Intent logReader = new Intent(); 
    logReader.setClassName("com.foo.Test", "com.foo.Test.MyServiceClass"); 
    logReaderPI = PendingIntent.getService(context, 0, logReader, 0); 
    long firstTime = SystemClock.elapsedRealtime(); 
    AlarmManager aMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    aMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 60 * 1000, logReaderPI); 
0

而且下面的代碼將啓動報警管理和運行任務每60秒,但我不知道這一點,Advantej代碼之間的區別

Intent myIntent = new Intent(context, GmailService.class); 

    pendingIntent = PendingIntent.getService(context, 0, myIntent, 0); 

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.MINUTE, 1); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

有人知道區別?

+0

你確定鬧鐘會重複嗎?我認爲set()函數是設置一次性警報。 – advantej 2011-04-07 18:35:03