gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:37:00 25 4
gpt4 key购买 nike

我是 android 这部分的新手,在这里我的目标是使用警报管理器每 2 分钟运行一次代码 fragment ,该代码 fragment 将轮询服务器(使用网站的 api)并根据返回的 JSON 生成通知。在网上查找后,我认为对我来说最好的选择之一是使用 intent service 和 android。

服务和接收者 list

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

参与我调用负责轮询通知的 Intent 服务的闪屏 Activity :

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
}

}

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

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 分钟轮询一次。)

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

最佳答案

要在关闭应用程序后保持接收器处于 Activity 状态是使用

android:process=":remote"

在需要保持 Activity 状态的接收器的 list 文件中。

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

在我们需要在应用程序关闭后保持 Activity 状态的接收器(在本例中为 TheReceiver)的 list 中。

附言:我还更改了我在应用程序中使用 IntentsService 和 AlarmManager 的方式,因为我之前(上面)的实现并不是解决它的好方法。

关于android - 从最近使用的应用程序中删除应用程序后,AlarmManager 停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32811857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com