从最近的应用程序中删除应用程序后,AlarmManager停止

时间:2015-09-27 19:17:20

标签: android android-service alarmmanager intentservice android-background

我是android的这一部分的新手,在这里我的目标是使用警报管理器每2分钟运行一个代码片段,它将轮询服务器(使用网站的api)并基于返回的JSON生成通知。 在查找网页后,我认为在我的案例中最好的选择之一将是使用意图服务和android。

服务和接收者的表现

<service
    android:name=".NotifyService"
    android:enabled="true"
    android:exported="false" >
</service>
<receiver
    android:name=".TheReceiver"
    android:enabled="true"
    android:exported="true" >
</receiver>
<receiver
    android:name=".OnOffReceiver"
    android:enabled="true"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

参与flash屏幕活动,我调用负责轮询通知的意向服务:

Intent msgIntent = new Intent(this, NotifyService.class);
    startService(msgIntent);

接收器在设备启动时启动警报:

public class OnOffReceiver extends BroadcastReceiver
{
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;
    public OnOffReceiver(){}
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent service = new Intent(context, NotifyService.class);
        service.setAction(NotifyService.CREATE);
        context.startService(service);
    }
} 

IntentService类

public class NotifyService extends IntentService
{
    public NotifyService()
    {
        super("NotifyService");
    }
    public static final int STATUS_RUNNING = 0;
    public static final int STATUS_FINISHED = 1;
    public static final int STATUS_ERROR = 2;

    @Override
    protected void onHandleIntent(Intent intent)
    {
        if (intent != null)
        {
            final String action = intent.getAction();
        }
        StartStuff();
    }

    public void StartStuff()
    {
        Intent intent = new Intent(this, TheReceiver.class);
        PendingIntent pend_intent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,1200,1200, pend_intent); 
     //1200ms to make it easier to test
    }

}

设置通知的接收器类,用于测试pupose我在这里没有做任何与网络相关的工作只是做一个简单的通知来检查应用程序是否在所有情况下运行

public class TheReceiver extends BroadcastReceiver
{
    public TheReceiver(){}
    @Override
    public void onReceive(Context context, Intent intent)
    {
         Toast.makeText(context, " Success ", Toast.LENGTH_SHORT).show();
         Log.d("Notification", "The Receiver Successful");
        showNotification(context);

    }
    private void showNotification(Context context)
    {         
        NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(context).setContentTitle("My notification").setContentText("Hello World!");
        mBuilder.setDefaults(Notification.DEFAULT_SOUND);
        mBuilder.setAutoCancel(true);
        NotificationManager mNotificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder.build());

    }  
} 

但是,通知仅在应用程序运行时或在最近的应用程序托盘中发出。 它不会在手机重新启动时开始通知,也不会在应用程序从最近的应用程序托盘中删除后通知。

应用程序需要像其他应用程序(如gmail,whatsapp)那样通知用户,即使它们已从最近的应用程序托盘中删除。 及时性和准时性不是很大的问题,因为可以容忍延迟5到10分钟。 (我打算在2分钟内进行民意调查。)

我哪里错了?还有,有更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:5)

要在关闭应用程序后保持接收器处于活动状态,请使用

android:process=":remote"

在接收器的清单文件中需要保持活动状态。

 <receiver
        android:name=".TheAlarmReceiver"
        android:process=":remote">
 </receiver>

在接收者的清单(本例中为TheReceiver)中,我们需要在应用关闭后保持活动状态。

P.S。 :我也改变了我为应用程序使用IntentsService和AlarmManager的方式,因为我之前的(上面)实现不是一个很好的解决方法。

答案 1 :(得分:1)

如果应用程序从最近的应用程序或“强制停止”中被杀死,它将不会自行重启。用户必须再次启动应用程序才能再次运行。没有办法阻止这种情况。这只是android的工作方式。

然而,有一种方法可以让你的应用程序在启动时运行。查看this link.