加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 从其他类调用MainActivity方法(扩展广播接收器)

发布时间:2020-12-15 04:29:05 所属栏目:Java 来源:网络整理
导读:我正在尝试从其他类(PhoneStateReceiver)调用MainActivity的方法display_notification. 但得到了这个错误: java.lang.RuntimeException: Unable to start receiver com.weekendproject.roshu.spamblocker.PhoneStateReceiver: java.lang.NullPointerExcepti
我正在尝试从其他类(PhoneStateReceiver)调用MainActivity的方法display_notification.

但得到了这个错误:

java.lang.RuntimeException: Unable to start receiver com.weekendproject.roshu.spamblocker.PhoneStateReceiver: java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String android.content.Context.getPackageName()’ on a null object reference

在MainActivity中专门指向此行的错误

Intent resultIntent = new Intent(getApplicationContext(),MainActivity.class);

但是我试图将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());
    }
}

PhoneStateReceiver.java

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提供的上下文.尝试将该上下文传递给display_notification,而不是使用活动的上下文,该上下文在您收到广播时可能没有运行.

所以将方法签名更改为:

public void display_notification(String incoming_number,Context context)

并且,从onReceive传递上下文,如下所示:

mActivity.display_notification(incomingNumber,context);

当你将它传递给Intent时使用这个上下文:

Intent resultIntent = new Intent(context,MainActivity.class);

EDITED

将整个方法放在接收器中并使用onReceive提供的上下文

要么,

将该行更改为:

NotificationManager mNotificationManager =
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

重要的部分是context.getSystemService,其中上下文来自onReceive.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读