大家好我正在构建一个应用程序,我想在其中添加订阅。这意味着每个用户都必须按月付费。
所以我想检查用户是否已经付款,如果他没有,那么我将需要一个对话框来重定向他付款。您建议我使用Service
,BroadcastReceiver
或AlarmaManager
?
我正在考虑创建一个Service
,并在其中创建一个AsyncTask
,如果用户已付款,则会检查数据库,然后如果没有通过对话框通知用户。此外,我还在考虑为用户创建Notiofications
订阅结束。
你有什么看法???
答案 0 :(得分:1)
我不确定您应用的概念,但如果您想检查用户是否订阅了当月,则无需为此运行Service
。
您应该在应用的启动画面或主要活动中查看此内容。但无论如何,
如果您仍然需要这样做,我建议您使用Service
或AlarmManager
。
BroadcastReceiver
不会单独工作,您需要根据需要在特定事件上触发它们。
此外,如果您使用服务,请记住,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());
}
}