使用主类AndroidJava中其他类的函数
您好,我在android java中将函数从另一个类加载到主类时遇到问题 包com.sourcebring.wordbring使用主类AndroidJava中其他类的函数,java,android,android-studio,Java,Android,Android Studio,您好,我在android java中将函数从另一个类加载到主类时遇到问题 包com.sourcebring.wordbring import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class MainActivity extends AppC
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load default xml
setContentView(R.layout.main);
ntfi Notifi_engine = new ntfi();
Notifi_engine.Send_notifi("hi", "welcome", R.drawable.wb_logo);
}
}
这是我的课
package com.inc.project;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.TaskStackBuilder;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Action;
import android.content.Intent;
import android.app.Activity;
import android.content.ContentResolver;
import android.support.v7.app.AppCompatActivity;
public class ntfi extends AppCompatActivity {
public void Send_notifi(String Title, String Content, int Icon)
{
// Create notification handler
NotificationCompat.Builder notifi_Builder = new NotificationCompat.Builder(this)
.setSmallIcon(Icon)
.setContentTitle(Title)
.setContentText(Content);
Intent resultIntent = new Intent(this, ntfi.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(WordbringMainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
notifi_Builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, notifi_Builder.build());
}
}
有了这段代码,我在程序上并没有错误,但当我编译项目并想要运行它时,我的android程序停止了
但是当我不使用ntfi类并且我在
MainActivity
没有问题,程序工作顺利。我想将此函数发送通知
放在单独的类中,就像顶级代码一样。。。有什么问题
这是我在运行android应用程序时的错误
05-08 19:41:44.510 918-918/com.inc.project E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.inc.project/com.inc.project.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
at android.app.ActivityThread.access$600(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.content.ContextWrapper.getPackageName(ContextWrapper.java:127)
at android.content.ComponentName.<init>(ComponentName.java:75)
at android.content.Intent.<init>(Intent.java:3004)
at com.inc.project.ntfi.Send_notifi(ntfi.java:27)
at com.inc.project.MainActivity.onCreate(MainActivity.java:23)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
at android.app.ActivityThread.access$600(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
05-08 19:41:44.510 918-918/com.inc.project E/AndroidRuntime:致命异常:主
java.lang.RuntimeException:无法启动活动组件信息{com.inc.project/com.inc.project.MainActivity}:java.lang.NullPointerException
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)上
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)上
在android.app.ActivityThread.access$600(ActivityThread.java:122)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:4340)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.NullPointerException
位于android.content.ContextWrapper.getPackageName(ContextWrapper.java:127)
位于android.content.ComponentName。(ComponentName.java:75)
位于android.content.Intent.(Intent.java:3004)
位于com.inc.project.ntfi.Send_notifi(ntfi.java:27)
位于com.inc.project.MainActivity.onCreate(MainActivity.java:23)
位于android.app.Activity.performCreate(Activity.java:4465)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)上
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)上
在android.app.ActivityThread.access$600(ActivityThread.java:122)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:4340)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
在dalvik.system.NativeStart.main(本机方法)
这不起作用,因为NotificationCompat.Builder(…)
需要一个上下文
对象,并且由于您自己创建了ntfi
实例(它不是由系统创建的),即使它扩展了appcompativity
它不是有效的上下文
您可以做的是:
public class ntfi {
public void Send_notifi(Context context, String Title, String Content, int Icon) {
NotificationCompat.Builder notifi_Builder = new NotificationCompat.Builder(context)
.setSmallIcon(Icon)
.setContentTitle(Title)
.setContentText(Content);
Intent resultIntent = new Intent(context, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(WordbringMainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
notifi_Builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, notifi_Builder.build());
}
并显示通知:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ntfi Notifi_engine = new ntfi();
Notifi_engine.Send_notifi(this, "hi", "welcome", R.drawable.wb_logo);
}
}
也可以作为一个旁注,您应该考虑java命名约定,用大写字母和变量名来初始化类名,小写字母。现在,您的代码很难阅读。
您真的不需要ntfi
extendappcompativity
。您只需在ntfi
类中定义一些static
方法,然后从活动中调用这些方法。在这种情况下,您应该将上下文传递给这些助手方法。以下是如何更改ntfi
类:
public class ntfi {
public static void Send_notifi(Context context, String Title, String Content, int Icon)
{
// Create notification handler
NotificationCompat.Builder notifi_Builder = new NotificationCompat.Builder(context)
.setSmallIcon(Icon)
.setContentTitle(Title)
.setContentText(Content);
Intent resultIntent = new Intent(context, ntfi.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(WordbringMainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
notifi_Builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, notifi_Builder.build());
}
}
然后您可以像这样调用Send\u notifi
函数:
ntfi.Send_notifi(“你好”,“欢迎”,R.drawable.wb_徽标)代码>
请注意,在这种情况下,您不必实例化ntfi,因此请去掉以下行:ntfi Notifi_engine=new ntfi()代码>
我希望这会有所帮助,顺便说一句,将类命名为ntfi(小写字母)并不是一个好主意。请考虑一些更具描述性的类名称。请遵循适当的Java命名约定。并检查您的LogCat输出是否有错误。我更改了它,但现在这一行有错误(Intent resultent=new Intent(this,ntfi.class);),无法解析getSystemService(Context.NOTIFICATION_SERVICE)上的方法(getSystemService);好的,酷,我很高兴这有帮助。如果你觉得答案有用,你可以投票表决。享受编码!