Java 从其他类(扩展广播接收器)调用MainActivity方法
我试图从其他类(PhoneStateReceiver)调用MainActivity的display\u通知方法 但出现以下错误: java.lang.RuntimeException:无法启动receiver com.weekendproject.roshu.spamblocker.PhoneStateReceiver:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()” 在MainActivity中,错误特别指向了此行 Intent resultent=新的Intent(getApplicationContext(),MainActivity.class)强> 但是,我尝试将Java 从其他类(扩展广播接收器)调用MainActivity方法,java,android,android-intent,Java,Android,Android Intent,我试图从其他类(PhoneStateReceiver)调用MainActivity的display\u通知方法 但出现以下错误: java.lang.RuntimeException:无法启动receiver com.weekendproject.roshu.spamblocker.PhoneStateReceiver:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.g
getApplicationContext()
更改为“this”
和“getActivity()”
,但它不起作用
这是完整的代码
MainActivity.java
public class MainActivity extends ActionBarActivity {
public void display_notification(String incoming_number) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(R.drawable.ic_action)
.setContentTitle("SpamBlocker alert !!")
.setContentText("SpamBlocker blocked number : " + incoming_number);
// **Error occured in following line**
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Random r = new Random();
int rand = r.nextInt(1000);
mNotificationManager.notify(rand, mBuilder.build());
}
}
public class PhoneStateReceiver extends BroadcastReceiver {
MainActivity mActivity;
@Override
public void onReceive(Context context, Intent intent) {
mActivity = new MainActivity();
mActivity.display_notification(incomingNumber); // call main activity methods
}
}
PhoneStateReceiver.java
public class MainActivity extends ActionBarActivity {
public void display_notification(String incoming_number) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(R.drawable.ic_action)
.setContentTitle("SpamBlocker alert !!")
.setContentText("SpamBlocker blocked number : " + incoming_number);
// **Error occured in following line**
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Random r = new Random();
int rand = r.nextInt(1000);
mNotificationManager.notify(rand, mBuilder.build());
}
}
public class PhoneStateReceiver extends BroadcastReceiver {
MainActivity mActivity;
@Override
public void onReceive(Context context, Intent intent) {
mActivity = new MainActivity();
mActivity.display_notification(incomingNumber); // call main activity methods
}
}
您没有使用onReceive提供的上下文。尝试传递该上下文以显示_通知,而不是使用在接收广播时可能未运行的活动上下文 因此将方法签名更改为:
public void display_notification(String incoming_number, Context context)
并且,按如下方式从onReceive传递上下文:
mActivity.display_notification(incomingNumber, context);
Intent resultIntent = new Intent(context, MainActivity.class);
并在将其传递给Intent时使用此上下文,如下所示:
mActivity.display_notification(incomingNumber, context);
Intent resultIntent = new Intent(context, MainActivity.class);
已编辑
将整个方法放在接收器中并使用onReceive提供的上下文
或者
将该行更改为:
NotificationManager mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
重要的部分是,context.getSystemService,其中context来自onReceive。使用以下命令:
Intent i = new Intent();
i.setClassName("com.test", "com.test.MainActivity");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
我认为新建活动对象不是一个好主意,否则生命周期将无法正确维护,其字段可能为空,这可能会导致NPE。
我建议您将通知生成器移动到一个util类中,详细代码可能与@dhun的答案类似。
顺便说一下,将这个util类的util方法设置为静态并不是一个好的实践,因为这样会使代码难以进行单元测试。更多详细信息,请参见。您正在向后执行
活动
和广播接收器
。接收者应该是您活动的成员,反之亦然。另外,您不应该像这样显式地调用newmainActivity()
。Android在内部完成了这项工作,并在通话中包含了一些与系统和应用程序相关的信息(比如软件包名称!)。请尝试以下方法:
MainActivity.java
public class MainActivity extends ActionBarActivity {
public void display_notification(String incoming_number) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(R.drawable.ic_action)
.setContentTitle("SpamBlocker alert !!")
.setContentText("SpamBlocker blocked number : " + incoming_number);
// **Error occured in following line**
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Random r = new Random();
int rand = r.nextInt(1000);
mNotificationManager.notify(rand, mBuilder.build());
}
}
public class PhoneStateReceiver extends BroadcastReceiver {
MainActivity mActivity;
@Override
public void onReceive(Context context, Intent intent) {
mActivity = new MainActivity();
mActivity.display_notification(incomingNumber); // call main activity methods
}
}
PhoneStateReceiver.java
public class MainActivity extends ActionBarActivity {
public void display_notification(String incoming_number) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(R.drawable.ic_action)
.setContentTitle("SpamBlocker alert !!")
.setContentText("SpamBlocker blocked number : " + incoming_number);
// **Error occured in following line**
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Random r = new Random();
int rand = r.nextInt(1000);
mNotificationManager.notify(rand, mBuilder.build());
}
}
public class PhoneStateReceiver extends BroadcastReceiver {
MainActivity mActivity;
@Override
public void onReceive(Context context, Intent intent) {
mActivity = new MainActivity();
mActivity.display_notification(incomingNumber); // call main activity methods
}
}
此外,我不确定发送广播的应用程序中发生了什么,但我感觉这可能仍然不起作用。如果仍然出现错误,请发布两个应用程序的完整代码。谢谢您的回答。我修改了它。但是,我得到了错误“java.lang.IllegalStateException:System services不可用于onCreate()之前的活动”此错误发生在“NotificationManager mNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);”这一行中,因此最终必须将该方法,在广播接收器中显示_通知,因为尚未创建活动且正在使用系统服务。查看我编辑的答案。谢谢你的回答。我是android应用程序开发的初学者。你能展示一些关于“如何将其放入util类”的链接吗