Java Android:可以创建一个通知对象来调用吗?(而不是每次都编写一个方法)
我是Android编程新手,我才刚刚开始学习,我通过修修补补,以及使用Java的知识,一点一点地学习 我想创建一个Java Android:可以创建一个通知对象来调用吗?(而不是每次都编写一个方法),java,android,Java,Android,我是Android编程新手,我才刚刚开始学习,我通过修修补补,以及使用Java的知识,一点一点地学习 我想创建一个notification类,以便在我想发出通知的任何时候保存要调用的所有通知方法。由于某种原因,当程序创建一个NotificationManager对象以创建通知通道时,我遇到了一个异常。这似乎只有在将通知类设置为单独的类时才会发生 主要活动类别: package com.example.colombian.textingclasses; import android.suppor
notification
类,以便在我想发出通知的任何时候保存要调用的所有通知方法。由于某种原因,当程序创建一个NotificationManager
对象以创建通知通道时,我遇到了一个异常。这似乎只有在将通知
类设置为单独的类时才会发生
主要活动类别:
package com.example.colombian.textingclasses;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
notifications n = new notifications(this);
}
}
通知类:
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
public class notifications {
private Context context;
public final String CHANNEL_ID = "customChannel";
public notifications(Context c) {
createNotificationChannel();
context = c;
}
//creates a notification channel
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "MyChannel";
String description = "Description";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
/*******Error happens below*******/
NotificationManager nm = (NotificationManager) context.getSystemService(NotificationManager.class); //error
nm.createNotificationChannel(channel);
}
}
}
例外情况:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.colombian.textingclasses, PID: 16471
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.colombian.textingclasses/com.example.colombian.textingclasses.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.Class)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6940)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.Class)' on a null object reference
at com.example.colombian.textingclasses.notifications.createNotificationChannel(notifications.java:32)
at com.example.colombian.textingclasses.notifications.<init>(notifications.java:19)
at com.example.colombian.textingclasses.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:7174)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6940)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
E/AndroidRuntime:致命异常:主
进程:com.example.columbian.textingclasses,PID:16471
java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.colombian.textingclasses/com.example.colombian.textingclasses.MainActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.Class)”
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
位于android.app.ActivityThread.-wrap11(未知来源:0)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
位于android.os.Handler.dispatchMessage(Handler.java:105)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6940)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:327)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
原因:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.Class)”
位于com.example.columbian.textingclasses.notifications.createNotificationChannel(notifications.java:32)
位于com.example.columbian.textingclasses.notifications.(notifications.java:19)
位于com.example.columbian.textingclasses.MainActivity.onCreate(MainActivity.java:14)
位于android.app.Activity.performCreate(Activity.java:7174)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
位于android.app.ActivityThread.-wrap11(未知来源:0)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
位于android.os.Handler.dispatchMessage(Handler.java:105)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6940)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:327)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
奇怪的是,当createNotificationChannel()
方法位于MainActivity
类中时,它工作得非常好。如果我将通知
类作为MainActivity
的内部类,它甚至似乎也能工作。我只是不明白,当我将它复制到一个单独的类来创建一个对象时,为什么会出现异常
请记住,这是基于API 26+或Android 8.0.0的
__
另外,我希望我的问题足够具体。这是我第一次在这里提问,所以如果有什么需要进一步澄清的,请告诉我。谢谢。您正在尝试在初始化
上下文之前创建通知频道。在使用之前初始化上下文,如下所示:
public notifications(Context c) {
context = c;
createNotificationChannel();
}
看起来是个不错的第一篇帖子。