2010-12-01 12 views
0

私は解決すべき簡単な質問がありますが、どうやってそれを行うのかは分かりません。Android:サービスからアクティビティにメソッドを呼び出す

TCP接続を探しているスレッドを実行するServiceを拡張するクラスがあります。入力された場合は、入力メッセージが読み込まれます。

入力メッセージが「START」であるならば、私はこの方法で、活動を開始します。

Intent dialogIntent = new Intent(getBaseContext(), VoIPCall.class); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress()); 
getApplication().startActivity(dialogIntent); 

この活動が実行されているが、サービスが実行され続けます。ある時点で私は "STOP"を予約するかもしれません。以前に作成したアクティビティでメソッドを呼びたいのですが、どのように対話するかはわかりません。

私は静的メソッドを使いたくありません。どうすればいいですか?

は、非常に多くの

EDITをありがとう:私はこれに私のコードを変更:

Intent dialogIntent = new Intent("com.voip.rudy.START_CALL"); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress()); 
getApplication().startActivity(dialogIntent); 

とマニフェストに:

<activity android:name=".VoIPCall"> 
    <intent-filter> 
     <action android:name="com.voip.rudy.START_CALL" /> 
     <action android:name="com.voip.rudy.STOP_CALL" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 


<category android:name="android.intent.category.DEFAULT" /> was required to avoid having it crash. 

EDIT:与えられた

ソリューションを私の問題は修正されましたが、実際にそのクラスのメンバー変数に作用したかったのですtialized。私がコンストラクタを呼び出すと、このアクティビティに戻り、メンバ変数を操作したいと思います。

私が別のアクションを呼び出すと、メンバー変数が初期化されず、何らかの形で新しいアクティビティが作成されたようです。とにかく同じ活動に取り組んで、オブジェクトを無傷で保つことはできますか?

James

+0

あなたのベストベットはおそらく放送を送信しています。 – Falmarri

答えて

2

Intent.FLAG_ACTIVITY_SINGLE_TOPを追加してください。 Intent.FLAG_ACTIVITY_REORDER_TO_FRONTはあなたの意図にフラグを立てて、startActivityを新しいアクションで呼び出すか、インテントを識別できる特別な余分なものを呼び出します。活動で

、呼び出されるメソッド書き込み:私は思う

@Override 
protected void onNewIntent(Intent intent) { 
    setIntent(intent); 
    handleIntent(intent); 
} 
+0

ありがとう!だから基本的に、私はちょうど2つのアクションを指定します。一つはメソッド、もう一つは "普通のコンストラクタ"です。 onCreateはhandleIntent()を実行し、残りのコード(メソッド+コンストラクタ)はhandleIntentになければなりません。intent.getAction()。equals()... right?このようにしてみると、ありがとう。 – James

+0

私は実装しましたが、なぜonCreateが実行されないのか不明な点があります。私はエラーも私のメインポストにEDITを掲載しました。ありがとうございました。 – James

+0

これは本当にうまく動作します。私は少し問題を抱えていますが、私はそれが正確ではないためだと思います。自分のアクティビティクラスで宣言されているメンバー変数がいくつかあります。あなたのメソッドを使用するとき、私は別のアクションを呼び出すと、メンバー変数は初期化されていない、新しいものを作成するようです。とにかく同じ活動に取り組んで、オブジェクトを無傷で保つことはできますか? – James

0

これはいくつかの方法がありますが、アプリケーションの全体的な構造によって異なります。すべてがうまくいく。私の頭の上には、これらの方法があります。

1)カスタムインテントを作成し、otehrがそれを送信したときにアクティビティまたはサービスに反応させます。 2)サービスの代わりに、ダイアログアクティビティ内の非同期タスクとしてのtcp接続の場合は、tcp接続を使用してサービスに渡して作業を行うことができます 3)ローカルサービスとリモートサービスSDKの例を見て、コールバックを使用しますデータをアクティビティに戻すための基礎としてのコード。インタフェースを介してサービスに戻ることもできます。 4)ブロードキャスト受信機「アーキテクチャ」をセットアップすることさえあるかもしれません。これには、ユーザー活動をサービスから完全に切り離すという利点があります。アプリケーションロジックの一部を別のプロセスのサービスに入れたり、デバイスブート時に実行されるプロセスに配置することもできます。

+0

ありがとうございます。とても感謝している。 – James

+0

ようこそ。 SDKにはこれらの事例がたくさんありますが、必要に応じてコードスニペットをスローすることができます。 –

+0

こんにちは、ありがとうJeff、本当に感謝します。残念ながら、私が実装したソリューションが新しいアクティビティを作り出すので、私の問題は完全には解決されていません(上記のコメントで、私の問題をもう少し詳しく説明しました)。あなたの解決策のいずれかが私の問題を解決してくれますか? – James

0

:のonCreate(またはonResume)から

private void handleIntent(Intent intent) { 
} 

が呼び出し、これを使用して:

handleIntent(getIntent()); 

とも書き込みをいずれの技法も機能するだろう。私はあなたが見ている振る舞いがアンドロイド内のアクティビティのライフサイクルに関連しており、処理の一部をonResume/onPauseまたはonStart/onStopメソッドに移動する必要があるかもしれないと推測しています。あなたのアクティビティonCreateが呼び出されていないのにあなたのアクティビティがアクティブであることがわかった場合、以前の呼び出しからのアクティビティインスタンスがまだシステム内に残っている可能性があります。そうであれば、OSがあなたが望む新しい活動の代わりにそれを使用している可能性があります。これが問題であるかどうかを確認する最善の方法は、オーバーライドするすべてのアクティビティメソッドの最初と最後に「Log.d」コールをいくつか配置することです。あなたはlogcatを見て何が起きているのかを知ることができます。使用する手法は、アクティビティの反応がTCPイベントとどのように同期するかに依存する場合もあります。完全に非同期の場合は、標準のブロードキャスト、またはメッセージの送信を伴うサービスコールバックを使用できます。同期が必要な場合は、サービスコールバックで行います。あなたがそれを見たことがない場合は、このSDKリンクはアクティビティライフサイクルのかなり良い説明を持っていますhttp://developer.android.com/reference/android/app/Activity.html

関連する問題