我正在制作一个应用程序,提醒我每10分钟休息一下(远离计算机)和每小时(休息10分钟,由加速度计跟踪)。
该应用程序使用AlarmManager来安排警报。您必须按“开始”按钮来安排警报。每10分钟,ShortBreakNotif广播被解雇。每隔一小时,就会触发BreakNotifService。 (我已经缩短了这些时间进行测试)。
ShortBreakNotif和BreakNotifService都需要启动MusicService。因此,因为有两个需要startService()的musicIntent的地方,我试图只在TimerViewActivity中创建musicIntent并让它可用于TimerViewActivity onDestroy方法。这是正确的方法吗?它不起作用(TimerViewActivity,第251行):
musicIntent = new Intent(TimerViewActivity.this, MusicService.class);
似乎上下文为空。可能是因为活动还没有完全初始化?如果musicIntent仅在几秒钟后创建,那该怎么办?它说:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
getApplicationContext()也不起作用。这会导致此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
我该怎么做?
这是完整的项目:https://github.com/felixglusch/AccelTimer/tree/master/app/src/main/java/com/example/felix/acceltimer
如果您对代码有任何疑问,请询问。
答案 0 :(得分:0)
您不应该通过构造函数创建活动。例如,在这种情况下,您应该使用上下文参数而不是新建TimerViewActivity.java
(您,这是正确的,赢得了正确的初始化)。
@Override
public void onReceive(Context context, Intent intent)
{
Log.i("BroadCastNotif", "**** BROADCAST ****");
Notif notification = new Notif();
notification.notifyUser(context);
TimerViewActivity tva = new TimerViewActivity();
Intent musicIntent = tva.getNewMusicServiceIntent();
context.startService(musicIntent);
}
你应该这样做:
Intent musicIntent = new Intent(context, MusicService.class);