我刚开始在学校和工作之外申请,我不知道应该采取什么样的路线。基本上,我正在构建一个应用程序,计算每天改变的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();
}
}
答案 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发生......等等......等等......等等......