我应该为我的应用创建5种不同的接收器/服务吗?

时间:2015-12-29 05:01:47

标签: android service broadcastreceiver alarmmanager

我刚开始在学校和工作之外申请,我不知道应该采取什么样的路线。基本上,我正在构建一个应用程序,计算每天改变的5个不同的祷告时间(5个祷告被命名为Fajr,Zuhr,Asr,Maghrib和Isha)。计算在设备上本地完成,我找到了开源代码,并让它正确计算。调用getTimes()方法后,应计算当天的祈祷时间,然后每隔一天重新计算一次。我认为setRepeating()类的AlarmManager方法对此有好处。我该怎么办呢?一旦计算了祈祷时间,就应开始服务以在该确切时间创建通知以通知用户是时候祈祷。这里的困境是,我不认为我应该使用5种不同的服务/接收者来通知5种不同的祈祷。什么是最好的方法呢?

目前,我的应用程序仅通知Maghrib(其中一个祈祷者)祈祷时间的用户。它也不会重新计算时间。

很抱歉,如果我不是很清楚,因为我是新手。如果需要,我可以扩展更多。

我的getTimes()方法:(为了简单起见,我删除了计算时间的代码)

public void getLocationTime(View v) {

        //Maghrib
        Calendar calMaghribTime = Calendar.getInstance();
        calMaghribTime.set(Calendar.HOUR_OF_DAY, getHourOfDay(strMaghribTime));
        calMaghribTime.set(Calendar.MINUTE, Integer.parseInt(strMaghribTime.substring(3,5)));
        calMaghribTime.set(Calendar.SECOND, 0);

        Intent myIntent = new Intent(MainActivity.this, NotificationCreatorReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC, calMaghribTime.getTimeInMillis(), pendingIntent);

        Toast.makeText(this, "NotificationCreator onReceive()", Toast.LENGTH_SHORT).show();
    } //end of getLocationTime()

这是我的接收者:

public class NotificationCreatorReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Intent service1 = new Intent(context, NotificationCreatorService.class);
        context.startService(service1);

    }
}

这是我的服务:

public class NotificationCreatorService extends Service {


    @Override
    public IBinder onBind(Intent arg0)
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
        // TODO Auto-generated method stub
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Toast.makeText(this, "NotificationCreator onStartCommand()", Toast.LENGTH_SHORT).show();

        // Use NotificationCompat.Builder to set up our notification.
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

        //icon appears in device notification bar and right hand corner of notification
        builder.setSmallIcon(R.mipmap.ic_launcher);

        // This intent is fired when notification is clicked
        Intent intent1 = new Intent(this.getApplicationContext(),MainActivity.class);
        PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this.getApplicationContext(),
                0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

        // Set the intent that will fire when the user taps the notification.
        builder.setContentIntent(pendingNotificationIntent);

        // Content title, which appears in large type at the top of the notification
        builder.setContentTitle("It's time for Maghrib");

        // Content text, which appears in smaller text below the title
        builder.setContentText("Maghrib prayer time has started in your area");

        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        // Will display the notification in the notification bar
        notificationManager.notify(0, builder.build());

        return START_STICKY;
    }

    @Override
    public void onDestroy()
    {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

}

1 个答案:

答案 0 :(得分:0)

简短回答 - 可能是1个服务,5个接收器。 Receiver旨在倾听事件并采取快速行动。应该使用Service来完成所有"重举"如有必要。

Receiver应该监听一个事件,如果你只需要发布一个通知,那么你可能就这样做并完成。但是,如果你想做其他任何事情,它应该将Intent传递给Service,并提供数据告诉Service如何回复。

编辑:

Receiver有10秒钟完成工作,否则将发生ANR(应用程序无响应)错误。 (参见文档:http://developer.android.com/reference/android/content/BroadcastReceiver.html)创建和发送通知不应该花这么长时间。

然而,"良好的设计"意味着你应该获得一个唤醒锁,然后将意图传递给Service来做任何事情。此外,您可能会发现您将要做的其他处理"在某一点。但是,如果我是你并且所需要的只是发布通知,我只需使用Receiver并稍后再担心。我可能会以这种方式处理超过十亿次通知而不会出错。但是,代码审查员可能会争辩说它可能"可能"让ANR发生......等等......等等......等等......