当前位置: 代码迷 >> Android >> Android上下文为空?
  详细解决方案

Android上下文为空?

热度:101   发布时间:2023-08-04 10:06:57.0

我正在制作一个应用程序,提醒我每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

我应该怎么做?

这是完整的项目: :

如果您对代码有任何疑问,请询问。

您不应该通过构造函数创建活动。 例如,在这种情况下,您应该使用context参数,而不是更新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);
  相关解决方案