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

时间:2015-10-22 16:37:15

标签: android service broadcastreceiver alarmmanager

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

所以我想检查用户是否已经付款,如果他没有,那么我将需要一个对话框来重定向他付款。您建议我使用ServiceBroadcastReceiverAlarmaManager

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

你有什么看法???

2 个答案:

答案 0 :(得分:1)

我不确定您应用的概念,但如果您想检查用户是否订阅了当月,则无需为此运行Service

您应该在应用的启动画面或主要活动中查看此内容。但无论如何, 如果您仍然需要这样做,我建议您使用ServiceAlarmManagerBroadcastReceiver不会单独工作,您需要根据需要在特定事件上触发它们。

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

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

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

答案 1 :(得分:1)

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

1.用户订阅后,将信息保存到数据库并启动服务。服务启动一个线程,线程获取数据和分析用户付款。然后使用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.接收广播信息并显示通知。

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,启动服务并检查数据库