2009-10-04 14 views
14

ブロードキャストインテントを送信しているメインアクティビティとバックグラウンドサービスでブロードキャストレシーバを作成しました。 30::ブロードキャストインテントを受信中にエラーが発生する

10-04 13:43.218: ERROR/AndroidRuntime(695): java.lang.RuntimeException:エラーアプリケーションは、私はそれを実行しようとログには、次のエラーメッセージを表示するたびにクラッシュします 放送受信意図{ アクション= com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (補足を有する)} で[email protected]

ブロードキャストメッセージがから送信されます次のメソッドの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" 

以下放送reveiverが定義される:

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); 

とマニフェストファイル私次はncludes:ログは上記のメッセージとアプリケーションのクラッシュを表示し、なぜ誰もが説明できるならば、私は本当に感謝

<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> 

ありがとうございます!

答えて

5

デバッガでステップバイステップを行って、クラッシュが発生する場所を正確に見つけましたか?

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

+58

問題が何であるか教えていただけますか? – Buffalo

4

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

問題があるかどうかはわかりませんが、確かに助けになりません。

7

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

アクティビティから開始しない場合は、intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK"が必要です。

+0

それは私のために働く! –

0

ライフサイクルメソッドonPause()onResume()ブロードキャストインテントの登録を解除して登録する方法です。

0

私の英語のために、私が何を言いたいのか分かりません。

私はこのコード行が問題の原因であると思う:

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

、あなたは2回を登録します。私はしたいので

userInfo.setSessionString(sessionString); 

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

0

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

-1

次のように何私のために働いたことはonNotificationメソッドを宣言してOK:

window.onNotification = function(event) { 
    alert('onNotification called!'); 
}; 
0

は、これは非常に古い質問ですが、私は多くの人々はまだそれについての回答を検索することだと思います。私の状況はこれと非常に似ています。

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

は、次のイベントが発生しているMainActivityのコード(たとえば、ネットワーク接続が切断されたとき、などなど)である:子アクティビティのOnResumeで

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

()関数:

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

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

unregisterReceiver(m_quitReceiver); 

子アクティビティclお尻:

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 
     } 
    } 
}; 

関連する問題