Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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
Java 从其他类(扩展广播接收器)调用MainActivity方法_Java_Android_Android Intent - Fatal编程技术网

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

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

我试图从其他类(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)

但是,我尝试将
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类”的链接吗