不确定在 Service、BroadcastReceiver 和 AlarmManager 之间选择什么

Not sure of what to choose between Service, BroadcastReceiver and AlarmManager

大家好,我正在构建一个应用程序,我想在其中添加订阅。这意味着每个用户都必须按月付费。

所以我想检查用户是否已经付款,如果他没有付款,他将能够继续处理订单,然后我想要一个对话框来重定向他付款。您建议我使用 ServiceBroadcastReceiverAlarmaManager 什么?

我正在考虑创建一个 Service,并在其中创建一个 AsyncTask,如果用户已付款,它将检查数据库,如果没有,则通过对话框通知用户。我也在考虑为订阅结束的用户创建 Notiofications

你怎么看???

我不确定你的应用程序的概念,但如果你想检查用户是否订阅了当月,你不需要 运行 a Service .

您应该在应用程序的启动画面或主 Activity 中检查此项。但无论如何, 如果您仍然需要这样做,我建议您使用 ServiceAlarmManagerBroadcastReceiver 不能单独使用,您需要根据需要在特定事件上触发它们。

此外,如果您使用服务,请记住 Android 可能会在内存不足的情况下终止您的服务。

所以我建议您使用 AlarmManager,它将在特定时间或其他时间后检查订阅状态。

PS:我知道这应该添加为评论,但我没有足够的声誉来评论所以发布为答案

我开发了一个类似的功能来检查很多账单。我结合了三种方法来确保稳定性。但我认为您应该使用 Google Play In-app Billing 来实现订阅,而不是使用本地数据库。如果必须使用数据库订阅:

1.After 用户订阅,将信息保存到数据库并启动服务。该服务启动一个线程,该线程获取数据并分析用户付款。然后使用 AlarmManager 设置 Notification 和 stopSelf.

public class NotificationService extends Service {
...
private AlarmManager am;
private PendingIntent pi;
private NotificationManager mNM;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

Thread thread = new Thread(null, mTask, "AlarmService_Service");
    thr.start();

    return START_REDELIVER_INTENT;
}
Runnable mTask = new Runnable() {
    public void run() {

        List<Subscription> mDataList = getData;

        if (mDataList.size() > 0) {

            for (Subscription mSubscription : mDataList) {


                if (mSubscription.isSub == true) {

                    Intent intent = new Intent(NotificationService.this,
                            AlamrReceiver.class);
                    intent.putExtra("data", (Serializable)mSubscription);
                    intent.setData(Uri.parse("custom://" + uniqueCode));
                    intent.setAction(String.valueOf(uniqueCode));

                    am = (AlarmManager) getSystemService(ALARM_SERVICE);
                    pi = PendingIntent.getBroadcast(
                            NotificationService.this, uniqueCode, intent,
                            PendingIntent.FLAG_CANCEL_CURRENT);
                    am.set(AlarmManager.RTC_WAKEUP, reminderTime, pi);
                    uniqueCode = uniqueCode + 1;

                }
            }

        }  

        NotificationService.this.stopSelf();
    }
};
}

2.Receive广播信息并显示通知。

public class AlamrReceiver extends BroadcastReceiver {
private NotificationManager mNM;

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    mNM = (NotificationManager)       context.getSystemService(context.NOTIFICATION_SERVICE);
    Subscription mSubscription = intent.getSerializableExtra("data");

    if (mSubscription != null) {
    showNotification(context, mSubscription);
    }
}
private void showNotification(Context context, Subscription mSubscription) {
    ...
    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            context);
    builder.setContentTitle(text);
    builder.setContentText(subTitleString + currencyString);
    builder.setSmallIcon(Common.CATEGORY_ICON[cIcon]);
    builder.setDefaults(Notification.DEFAULT_VIBRATE);
    builder.setAutoCancel(true);

    Intent intent = new Intent(context, BillDetailsActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(BillDetailsActivity.class);
    intent.putExtra("dataMap", (Serializable) tMap);

    stackBuilder.addNextIntent(intent);
    PendingIntent contentIntent = stackBuilder.getPendingIntent(0,
            PendingIntent.FLAG_UPDATE_CURRENT);

    builder.setContentIntent(contentIntent);
    int uniqueRequestCode = (int) System.currentTimeMillis();
    mNM.notify(uniqueRequestCode, builder.build());

}

}

  1. 不要忘记BOOT_COMPLETED,当phone重新启动时,启动服务并检查数据库