Search code examples
androidservicebroadcastreceiveralarmmanager

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


Hello guys i am building an app in which i would like to add subscription. That means that every user has to pay monthly.

So i want to check if the user has paid he will be able to proceed with the orders if he didn't then i want a dialog to redirect him to pay. What would you suggest me to use Service, BroadcastReceiver or AlarmaManager?

I was thinking of creating a Service and within it create an AsyncTask that will check to the database if the user has paid and then if not inform the user with a dialog. Also i was thinking of creating Notiofications to the user that the subscription ending.

What is your opinion???


Solution

  • I developed a similar function to check many bills. I combined the three methods to ensure stability. But I think you should use Google Play In-app Billing to achieve subscriptions instead of using a local database. If you must use a database to subscribe:

    1.After users subscribe, saved info to the database and start a service. the service start a thread,the thread get Data and Analyzing user payments. then use AlarmManager to set Notification and 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 broadcast information and show Notification.

    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. Do not forget BOOT_COMPLETED , when the phone restarted , start the service and check the database