【问题标题】:Android context is null?Android上下文为空?
【发布时间】:2015-10-19 01:16:54
【问题描述】:

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

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

【问题讨论】:

  • 我认为您必须在接收器中创建一个意图,在服务中创建一个意图,并且不要尝试封装在活动中,因为上下文会有所不同。

标签: android android-activity android-service android-context


【解决方案1】:

您不应该通过构造函数创建活动。例如,在这种情况下,您应该使用 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);

【讨论】:

  • 谢谢!这就是我最初的想法,但我认为在一个地方做new Intent(context, MusicService.class) 可能会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2015-11-14
  • 2011-01-08
相关资源
最近更新 更多