19

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

10-04 13:30:43.218: ERROR/AndroidRuntime(695): java.lang.RuntimeException: com.client でブロードキャスト インテント { action=com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (エクストラあり) } を受信中にエラーが発生しました。 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>

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

ありがとう!

4

8 に答える 8

10

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

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

于 2010-12-27T09:26:32.547 に答える
7

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

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

于 2009-10-04T12:12:32.963 に答える
5

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

注意すべきことの 1 つは、必要に応じて基本クラスのコンストラクターを適切に呼び出している Android ライフサイクル イベントをオーバーライドしているかどうかです。

于 2009-10-04T11:55:38.340 に答える
0

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

于 2014-01-13T04:52:14.923 に答える
0

私の英語のせいで、あなたが私の言いたいことを理解できるかどうか確信が持てません.

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

userInfo.setSessionString(sessionString); 

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

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

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

于 2012-08-03T00:52:06.550 に答える
0

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

于 2012-06-05T11:18:32.797 に答える
0

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

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

以下は、イベントが発生したときの 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
        }
    }
};

お役に立てれば。

于 2016-03-10T16:39:23.837 に答える