2 つのアクティビティと SMS レシーバー クラスを持つアプリケーションを作成しました。アプリケーションの目的は、特定のテキスト/SMS メッセージが受信されたときに、両方のアクティビティ内の特定の状態を変更することです。たとえば、アクティビティ 1 とアクティビティ 2 のトグル ボタンの状態を変更するようにアプリに指示するテキスト メッセージをアプリが受け取る場合があります。問題は、アクティビティ 2 がまだ開かれていない場合、アプリがクラッシュすることです (アクティビティがこれより前に 2 つが開かれている場合は、クラッシュしません)。アクティビティ 2 が開かれていない場合でも、アプリが正常に動作する必要があります。アプリがクラッシュすると、logcat でこのエラーが発生します
Caused by: java.lang.NullPointerException
これはレシーバー クラスの 187 行目で発生します (ここでアクティビティ 2 のトグル ボタンの状態を変更します)
これは、アクティビティ 2 がまだ開かれておらず、アクティビティ 2 内のボタンやその他のものが開かれていないことが原因であると推測されます。まだ初期化/識別されていないため、受信者はそれが何を指しているのかわかりません。
これを回避する良い方法は何ですか? アプリの初回起動時にバックグラウンドで 2 番目のアクティビティを開く方法はありますか? または、トグルボタンを他の場所で宣言する必要がありますか?
私はこれにかなり慣れていないので、フィードバックは素晴らしいでしょう!ありがとう!
レシーバー クラス:
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
Global.SMSarray = new char[20];
Global.controlNumAr = new char[11];
//Global.controlNumAr = Global.controlNum.toCharArray();
if (extras ==null)
return;
Object[] pdus = (Object[]) extras.get("pdus");
for (int i = 0; i < pdus.length; i++) {
SmsMessage SMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
Global.sender = SMessage.getOriginatingAddress();
String body = SMessage.getMessageBody().toString();
Global.SMSarray = body.toCharArray();
Intent in = new Intent("SmsMessage.intent.MAIN").putExtra("get_msg", Global.sender+":"+body);
if (PhoneNumberUtils.compare(Global.controlNum, Global.sender)){
if((Global.SMSarray[0]=='O')&&(Global.SMSarray[1]=='K')){
Toast toast= Toast.makeText(context, "OK",
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, -100);
toast.show();
this.abortBroadcast();
}
else{
//Zone A
if(Global.SMSarray[12]=='a'){
Global.mytbSA.setChecked(false);
Global.mytbSGA.setChecked(false);
Global.BarA.setVisibility(View.INVISIBLE);
Global.mytbSA.setVisibility(View.VISIBLE);
Global.BarGA.setVisibility(View.INVISIBLE);
Global.mytbSGA.setVisibility(View.VISIBLE);
Global.setAButton.setEnabled(true);
Global.unsetAButton.setEnabled(false);
this.abortBroadcast();
context.sendBroadcast(in);
}
else if (Global.SMSarray[12]=='A'){
Global.mytbSA.setChecked(true);
Global.mytbSGA.setChecked(true);
Global.BarA.setVisibility(View.INVISIBLE);
Global.mytbSA.setVisibility(View.VISIBLE);
Global.BarGA.setVisibility(View.INVISIBLE);
Global.mytbSGA.setVisibility(View.VISIBLE);
Global.setAButton.setEnabled(false);
Global.unsetAButton.setEnabled(true);
this.abortBroadcast();
context.sendBroadcast(in);
};