2016-12-25 1 views
1

これにより、結果を返すときにアクションを設定する目的は、通常、我々は唯一のエキストラやウリデータを設定する必要があり、Training for Android developerssetResult

//Create intent to deliver some kind of result data 
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); 

setResult(Activity.RESULT_OK, result); 

finish(); 

からのコード例です。ここでカスタムアクションを指定する目的は何ですか? 更新:

Googleのアプリで使用する画像を選択するにはギャラリーアプリを開きたいとします。

私は例のコードでは "com.example.RESULT_ACTION" を設定していない

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Check which request we're responding to 
    if (requestCode == PICK_IMAGE_REQUEST) { 
     // Make sure the request was successful 
     if (resultCode == RESULT_OK) { 
      Uri imageUri = data.getData(); 
      // Do something with the image here 
    } 
} 

結果を処理結果

Intent result = new Intent();    
    result.setData(_Uri.parse("content://result_uri"); 
    setResult(Activity.RESULT_OK, result); 
    finish(); 

を返すギャラリーアプリに

Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent,PICK_IMAGE_REQUEST); 

を呼び出します上記。

答えて

3

startActivityForResutlに電話すると、2番目の/サブのアクティビティからの応答が期待され、ユーザーが前のアクティビティに戻るときにonActivityResultがトリガーされます。あなたのケースでは、あなたが以前の活動にnullようintentを受け取ることになります

onActivityResultは3パラメータを持っており、そのうちの一つがintentであり、第二/サブ活動がsetResult関数を呼び出していない場合result意図決して

あなたがsetResult目的球を呼び出さない場合

あなたの前のアクティビティを配信する最初のアクティビティ

Intent intent = new (..., secondActivity); 
.. 
startActivityForResult(intent,1); 

セカンド活動

.... 
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); 

//setResult(Activity.RESULT_OK, result); this is not there 
finish(); 

最初の活動

... OnActivityResult(int response, int request, Intent data) 
       //          ^^^ will be null because 
       // setResult was not called in second activity so to get data intent 
       // you have to call setResult   

注:あなたはどんな結果が、代わりにstartActivityForResultstartActivityを使用したくないと第二の活動にsetResultをコールする必要がなくなる場合OnActivityResult関数はトリガされません


更新:

Intent result = new Intent("com.example.RESULT_ACTION", 
Uri.parse("content://result_uri")); 

com.example.RESULT_ACTION:この場合で行われるアクションのタイプは、結果アクション

であることがintent-filter

<activity android:name="ShareActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.SEND"/> 
     ^^^ 
    </intent-filter> 
</activity> 
actionフィールドに類似しているものを意味します

これにより、実行されたアクションのタイプを確認できます。活動のグラムあなたは

if(data.getAction().equals("com.example.RESULT_ACTION")) 
{ // do this} 
else if(data.getAction().equals("android.intent.action.SEND"") { 
    // do something here} 

を行うことができますし、明らかにインクルードは、要求と応答コードを使用して行うことができますが、2つのアプリケーションの代わりに、2つのアクティビティ

content://result_uriの間でデータやアクション取る場所がちょうどあるとき、これは便利です結果あなたは

を使用するシステムにインストールされているアプリで画像を開くために意図を使用して画像を送信する場合:もう一度ドキュメントの例が、この平均値は、データの種類は、例えば意図

に関連付けられたデータの詳細を意味します image/*は画像

例えば、それは、さらにデータを検証するために使用することができますURIを与えるあなたの意図は平均で作業しているデータ/ファイルリソースを与えるgetDataあるファイルの種類を説明し

intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*"); 

タイプ。

通信は2つのアプリの間で行われるとき、これは非常に便利ですが、同じアプリ内でstartActivityForResultを使用している間、あなたは、単にこれがお手伝いします

+0

私の質問はここでカスタムアクションを指定することです。この場合は "com.example.RESULT_ACTION"を設定します。私はなぜそれを設定する必要があるのか​​分からず、必要ではないと思います。 – user3591494

+0

@ user3591494それは必要ではない、答えを更新させてください –

+0

ありがとう、パヴネ。私はこれが物事をクリアしたと思う。しかし、私は2つのアプリで2つのアクションではないことがなぜ役立つのか、まだ完全に理解していませんか?それについて詳しく説明したり、別の例を教えてください。 – user3591494

0

・ホープのリクエストとレスポンスコードを使用して結果の種類を識別することができます

http://www.vogella.com/tutorials/AndroidIntent/article.html#retrieving-result-data-from-a-sub-activity

インテントは、特定のイベントが発生したことをAndroidシステムに通知するために使用されます。インテントは、実行すべきアクションを記述し、そのようなアクションを実行すべきデータを提供することが多い。たとえば、アプリケーションはインテントを介して特定のURLのブラウザコンポーネントを起動できます。これは次の例で示されます。

String url = "http://www.vogella.com"; 
Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.parse(url)); 
startActivity(i); 

しかし、Androidシステムは特定の意図に反応するコンポーネントをどのように特定していますか?

コンポーネントは、特定のアクションと特定のデータに対してインテントフィルタを使用して自身を登録できます。インテントフィルタは、アクティビティ、サービス、またはブロードキャストレシーバがコンポーネントの機能を宣言することによって対応できるインテントのタイプを指定します。

アンドロイド成分は静的のAndroidManifest.xmlや放送受信機の場合にも動的にコードを介してのいずれかでインテントフィルタを登録します。インテントフィルタは、カテゴリ、アクション、およびデータフィルタによって定義されます。また、追加のメタデータを含めることもできます。

意図はAndroidシステムに送信される場合、Androidプラットフォームは、受信機の決意を実行します。インテントに含まれるデータを使用します。複数のコンポーネントが同じインテントフィルタに登録されている場合、ユーザーはどのコンポーネントを起動するかを決定できます。

0

それぞれの着信目的は1つのアクションだけと一つのデータ型を指定しますが、 それは<action>の複数のインスタンスを宣言するためにOKです、<category>、各<intent-filter>.

<data>要素はどんな活動かと言いますあなたの結果をアクティビティやsubActivitiesに送信している場合は、Intentのアクションを定義して、の適切な処理のために<intent-filter>が定義されているため、結果を送信するアクティビティを再度定義する必要があります。。

したがって、これはもっと安全なアプローチの<intent-filter>に似ています。

関連する問題