web-dev-qa-db-ja.com

ブロードキャストインテント問題の受信エラー

メインアクティビティのブロードキャストレシーバーと、ブロードキャストインテントを送信するバックグラウンドサービスを作成しました。アプリケーションを実行しようとするたびにアプリケーションがクラッシュし、ログに次のエラーメッセージが表示されます。

10-04 13:30:43.218:ERROR/AndroidRuntime(695):Java.lang.RuntimeException:Error receive broadcast Intent {action = com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE(has extras)} in com.client。 gaitlink.GaitLink$LoginStatusReceiver@431690e8

ブロードキャストメッセージは、CommunicationServiceクラスから次のメソッドで送信されます。

private void announceLoginStatus(){
    Intent intent = new Intent(LOGIN_STATUS_UPDATE);
    intent.putExtra(SERVER_MESSAGE, mServerResponseMessage);
    intent.putExtra(SESSION_STRING, mSessionString);
    sendBroadcast(intent);
}

どこ

String LOGIN_STATUS_UPDATE = "com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE"

メインアクティビティでは、次のブロードキャスト受信者が定義されています。

public class LoginStatusReceiver extends BroadcastReceiver {

        public void onReceive(Context context, Intent intent) {
            String serverMessage = intent.getStringExtra(CommunicationService.SERVER_MESSAGE);
            String sessionString = intent.getStringExtra(CommunicationService.SESSION_STRING);

            userInfo.setSessionString(sessionString);
            saveSettings();
        }
    }

そしてonResumeメソッドに登録されます:

        IntentFilter loginStatusFilter;
        loginStatusFilter = new IntentFilter(CommunicationService.LOGIN_STATUS_UPDATE);
        loginStatusReceiver = new LoginStatusReceiver();
        registerReceiver(loginStatusReceiver, loginStatusFilter);

また、マニフェストファイルには以下が含まれます。

<activity Android:name=".GaitLink"
              Android:label="@string/app_name">
        <intent-filter>
            ...
            <action Android:name="com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE" />
        </intent-filter>
    </activity>

ログに上記のメッセージが表示され、アプリケーションがクラッシュする理由を誰かに説明していただければ幸いです。

ありがとう!

17
Niko Gamulin

デバッガーを段階的に実行して、クラッシュが発生する場所を正確に見つけましたか?

注意が必要なのは、必要に応じて基本クラスのコンストラクターを適切に呼び出しているAndroidライフサイクルイベントをオーバーライドする場合です。

4
JRL

新しいactivityを開始するときにintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);を追加して解決しました。

activityから開始しない場合は、intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);が必要です。

9
shencp

2つのIntentフィルターがあります。必要なのは1つだけです。 registerReceiver()を介してBroadcastReceiverを登録する場合は、そのAPI呼び出しの2番目のパラメーターであるIntentFilterのみを使用してください。<intent-filter>要素の<activity>マニフェスト内。

それがあなたの問題であるかどうかは確実にはわかりませんが、それでも確かに役に立ちません。

6
CommonsWare

これは非常に古い質問ですが、多くの人がまだ答えを探していると思います。私の状況はこれとよく似ています。

私がやりたかったことは、特定のイベントが親アクティビティで発生したときに、つまりMainActivityから子アクティビティにブロードキャストメッセージを送信することによって、子アクティビティでfinish()を呼び出すことです。

以下は、イベントが発生したとき(ネットワーク接続が切断されたときなど)のMainActivityのコードです。

    Intent intent = new Intent("ACTIVITY_FINISH");
    intent.putExtra("FinishMsg","ACTIVITY_FINISH: Network broken.");
    sendBroadcast(intent);

子アクティビティのOnResume()関数で:

    IntentFilter quitFilter = new IntentFilter();
    quitFilter.addAction("ACTIVITY_FINISH");
    registerReceiver(m_quitReceiver, quitFilter);

子アクティビティのOnPause()関数で:

    unregisterReceiver(m_quitReceiver);

子アクティビティクラス内:

BroadcastReceiver m_quitReceiver = new BroadcastReceiver() 
{
    public void onReceive(Context context, final Intent intent) 
    {
        if (intent.getAction().equalsIgnoreCase("ACTIVITY_FINISH"))
        {
            Log.d("INFO", intent.getExtras().getString("FinishMsg"));
            finish(); // do here whatever you want
        }
    }
};

お役に立てれば。

0
aquadeep

私の英語のおかげで、私が言いたいことが理解できるかわかりません。

このコード行が問題の原因だと思います:

userInfo.setSessionString(sessionString); 

私がしたいので私のプロジェクトは間違っていました:

int i = Integer.parseint(intent.getExtars("9"));

そして、あなたは2回登録します。

0
zhuizhu

インテントが元のアクティビティから実行されていることを確認し、物事を1つのクラスに入れると、問題全体が解消されることがわかりました。

0
msj121

ブロードキャストインテントの登録解除および登録には、ライフサイクルメソッドonPause()およびonResume()メソッドを使用する必要があると思います。

0
user1008590