2011-04-05 48 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