不确定在 Service、BroadcastReceiver 和 AlarmManager 之间选择什么
Not sure of what to choose between Service, BroadcastReceiver and AlarmManager
大家好,我正在构建一个应用程序,我想在其中添加订阅。这意味着每个用户都必须按月付费。
所以我想检查用户是否已经付款,如果他没有付款,他将能够继续处理订单,然后我想要一个对话框来重定向他付款。您建议我使用 Service
、BroadcastReceiver
或 AlarmaManager
什么?
我正在考虑创建一个 Service
,并在其中创建一个 AsyncTask
,如果用户已付款,它将检查数据库,如果没有,则通过对话框通知用户。我也在考虑为订阅结束的用户创建 Notiofications
。
你怎么看???
我不确定你的应用程序的概念,但如果你想检查用户是否订阅了当月,你不需要 运行 a Service
.
您应该在应用程序的启动画面或主 Activity 中检查此项。但无论如何,
如果您仍然需要这样做,我建议您使用 Service
或 AlarmManager
。
BroadcastReceiver
不能单独使用,您需要根据需要在特定事件上触发它们。
此外,如果您使用服务,请记住 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());
}
}
- 不要忘记BOOT_COMPLETED,当phone重新启动时,启动服务并检查数据库
大家好,我正在构建一个应用程序,我想在其中添加订阅。这意味着每个用户都必须按月付费。
所以我想检查用户是否已经付款,如果他没有付款,他将能够继续处理订单,然后我想要一个对话框来重定向他付款。您建议我使用 Service
、BroadcastReceiver
或 AlarmaManager
什么?
我正在考虑创建一个 Service
,并在其中创建一个 AsyncTask
,如果用户已付款,它将检查数据库,如果没有,则通过对话框通知用户。我也在考虑为订阅结束的用户创建 Notiofications
。
你怎么看???
我不确定你的应用程序的概念,但如果你想检查用户是否订阅了当月,你不需要 运行 a Service
.
您应该在应用程序的启动画面或主 Activity 中检查此项。但无论如何,
如果您仍然需要这样做,我建议您使用 Service
或 AlarmManager
。
BroadcastReceiver
不能单独使用,您需要根据需要在特定事件上触发它们。
此外,如果您使用服务,请记住 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());
}
}
- 不要忘记BOOT_COMPLETED,当phone重新启动时,启动服务并检查数据库