Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用意图创建报警,但存在一些问题_Android_Android Intent_Nullpointerexception_Alarmmanager_Android Context - Fatal编程技术网

Android 使用意图创建报警,但存在一些问题

Android 使用意图创建报警,但存在一些问题,android,android-intent,nullpointerexception,alarmmanager,android-context,Android,Android Intent,Nullpointerexception,Alarmmanager,Android Context,我对androidstudio真的很陌生(对Java也相对陌生),我正在尝试创建一个应用程序,允许用户输入一个时间,并让计时器在该时间发生时开始倒计时。在研究之后,似乎使用意图是最好的方法,但我在理解如何使用它时遇到了一些问题。现在,我的主活动文件(称为倒计时)中有以下代码: 在我的接收方文件中,我有: public class CountdownStarter { TextView mDisplay; public void onRecieve() { final CountDown

我对androidstudio真的很陌生(对Java也相对陌生),我正在尝试创建一个应用程序,允许用户输入一个时间,并让计时器在该时间发生时开始倒计时。在研究之后,似乎使用意图是最好的方法,但我在理解如何使用它时遇到了一些问题。现在,我的主活动文件(称为倒计时)中有以下代码:

在我的接收方文件中,我有:

public class CountdownStarter {
TextView mDisplay;
public void onRecieve() {

    final CountDownTimer aCounter = new CountDownTimer(Countdown.finalTime, 1000) {

        public void onTick(long millisUntilFinished) {
            mDisplay.setText("Seconds remaining: " + millisUntilFinished / 1000);
        }

        public void onFinish() {
            mDisplay.setText("Finished");
        }
    };
    aCounter.start();
}
}
现在,运行调试器时,我收到以下消息:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.android.timerexample, PID: 32276
              java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
                  at android.content.ComponentName.<init>(ComponentName.java:128)
                  at android.content.Intent.<init>(Intent.java:5283)
                  at com.example.android.timerexample.Countdown$1.onClick(Countdown.java:42)
                  at android.view.View.performClick(View.java:5702)
                  at android.widget.TextView.performClick(TextView.java:10888)
                  at android.view.View$PerformClick.run(View.java:22533)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:158)
                  at android.app.ActivityThread.main(ActivityThread.java:7229)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
E/AndroidRuntime:致命异常:主
进程:com.example.android.timerexample,PID:32276
java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.lang.String android.content.Context.getPackageName()”
位于android.content.ComponentName。(ComponentName.java:128)
位于android.content.Intent.(Intent.java:5283)
位于com.example.android.timerexample.Countdown$1.onClick(Countdown.java:42)
在android.view.view.performClick上(view.java:5702)
在android.widget.TextView.performClick上(TextView.java:10888)
在android.view.view$PerformClick.run(view.java:22533)
位于android.os.Handler.handleCallback(Handler.java:739)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:158)
位于android.app.ActivityThread.main(ActivityThread.java:7229)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1230)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我试图研究它,但我只是不明白为什么我会得到NullPointerException或如何修复它-我肯定在这里做了一些错误的事情,但我不知道下一步是什么。任何帮助都会很有帮助

一个
活动
是一个
上下文
,因此没有必要使用
上下文
,您可以使用
倒计时。这里使用
而不是
上下文
变量

Intent intent = new Intent(context, Countdown.class); // here
alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // and here
或者您需要实际分配
上下文

private Context;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_countdown);
    context = this; // Here

代码片段中没有上下文的初始化,正如前面提到的,活动类中不需要上下文对象

您可以替换此代码

Intent intent = new Intent(context, Countdown.class);
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);


context
为空。虽然您是对的,但我不确定对Java相当陌生的人会立即理解这个问题。让我试试:)如前所述,上下文变量为null,使用它会导致(“抛出”)NullPointerException。现在,有两个选项,或者在使用上下文变量之前分配它,就像这个答案中的第二个代码块一样。或者,不要在
new Intent(…)
中传递上下文变量,而是使用Countdown.this,它是对周围类实例的引用,周围类是AppCompatActivity的超类,它是上下文的超类。@Micha可以自己回答。我不需要知道这些事情
Intent intent = new Intent(context, Countdown.class);
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
Intent intent = new Intent(this, Countdown.class);
alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);