【Androidベース】IntentによるActivity間のデータ転送

8634 ワード

前言:


前の記事では、Intentの使い方、Activityと暗黙的なIntentの起動方法についてお話ししました.この記事では、Intentを利用してActivity間でコミュニケーションする方法についてお話しします.
 

Activityから返される結果を取得します。


Activityを起動する方法はstartActivity(Intent intent)だけでなく、startActivity ForResult()を使用してActivityを起動し、終了したときに結果を返すこともできます.
例えば、システムカメラを呼び出してアプリケーションで写真を撮ってActivityに戻ることができます.このとき、この方法で写真を結果としてActivityに返すことができます.たとえば、この方法でシステム連絡先アプリケーションを起動し、個人の詳細な連絡先を取得できます.
注意:startActivity ForResult()を呼び出すときは、表示Intentまたは暗黙的Intentを利用できますが、明示的Intentを利用できるときはできるだけ明示的Intentを利用することで、戻りの結果が期待される正しい結果であることを保証できます.
 

Activityを起動します。


 
startActivity ForResult()でActivityを起動する場合、Intentの書き方はstartActivity()と同じで、何の違いもありません.ただ、起動パラメータとして追加のIntegerの変数を渡す必要があります.起動したActivityが終了すると、このパラメータはコールバック関数のパラメータとして返されます.つまり、Activityを起動したときに渡されるパラメータ(requestCode)と、結果を返すときのパラメータ(requestCode)は一致します.
次にstartActivity ForResult()を呼び出して連絡先を取得する例を示します.
static final int PICK_CONTACT_REQUEST = 1;  // The request code
... 
private void pickContact() { 
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

startActivity ForResult()関数はActivityソースコードで次のようになります.
 /**
     * Same as calling {@link #startActivityForResult(Intent, int, Bundle)}
     * with no options.
     *
     * @param intent The intent to start.
     * @param requestCode If >= 0, this code will be returned in
     *                    onActivityResult() when the activity exits.
     *
     * @throws android.content.ActivityNotFoundException
     *
     * @see #startActivity
     */
    public void startActivityForResult(Intent intent, int requestCode) {
        startActivityForResult(intent, requestCode, null);
    }

この方法はActivityでリロードされ,startActivity ForResult(intent,requestCode,null);方法は貼らない.しかし、この方法の使用上の注意点について、私は皆さんに翻訳します.
この方法は戻り結果のあるActivityを起動するためにしか使用できません.Intentのパラメータ設定に注意してください.singleTaskのlaunch modeを使用するActivityを起動することはできません.singleTaskでActivityを起動します.そのActivityは別のActivityスタックで、すぐにRESULTを受け取ります.CANCELEEDメッセージ;
Activityライフサイクル関数onResumeの前にstartActivity ForResult()メソッドを呼び出すことはできません.onResumeの前に呼び出すと、起動したActivityが終了して結果を返すまで、そのActivityが表示されません.これは、別のActivityに再配向したときにウィンドウが点滅しないようにするためです.
 

受信結果:


startActivity ForResult()が起動したActivityがタスクを終了すると、ActivityのonActivity Result()メソッドが呼び出されます.このメソッドには3つのパラメータがあります.
resquestCode:Activityの起動時に渡されるrequestCode;
resultCode:呼び出しが成功または失敗した変数を表し、値は次のいずれかである.
   /** Standard activity result: operation canceled. */
    public static final int RESULT_CANCELED    = 0;
   /** Standard activity result: operation succeeded. */
    public static final int RESULT_OK           = -1;

Intent:返却内容を含むIntent;
次のコードは、連絡先の結果を取得する処理の例です.
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to 
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful 
        if (resultCode == RESULT_OK) {
            // The user picked a contact. 
            // The Intent's data Uri identifies which contact was selected. 
 
            // Do something with the contact here (bigger example below) 
        } 
    } 
}

注意:返されたIntent結果を正しく処理するには、Intent返された結果のフォーマットを明確に理解する必要があります.あなたが自分で書いたIntentを返却結果としてよく知っていますが、呼び出されたシステムアプリ(カメラ、連絡先など)であれば、Intent返却結果フォーマットはよく知っているはずです.例えば、連絡先アプリケーションは連絡先URIを返し、カメラはBitmapデータを返します.
 

処理の結果:


次のコードは、連絡先を取得した結果をどのように処理するかです.
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request it is that we're responding to 
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful 
        if (resultCode == RESULT_OK) {
            // Get the URI that points to the selected contact 
            Uri contactUri = data.getData();
            // We only need the NUMBER column, because there will be only one row in the result 
            String[] projection = {Phone.NUMBER};
 
            // Perform the query on the contact to get the NUMBER column 
            // We don't need a selection or sort order (there's only one result for the given URI) 
            // CAUTION: The query() method should be called from a separate thread to avoid blocking 
            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.) 
            // Consider using CursorLoader to perform the query. 
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();
 
            // Retrieve the phone number from the NUMBER column 
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);
 
            // Do something with the phone number... 
        } 
    } 
}

次のコードは、呼び出しシステムカメラが返す結果を処理します.
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        mImageView.setImageBitmap(imageBitmap);
    } 
}

起動Intentの取得:


起動されたActivityでは、このActivityを起動するIntentを受信できます.このIntentを取得するには、ライフサイクルの範囲内でgetIntent()を呼び出すことができますが、一般的にはonCreat関数とonStart関数で取得されます.以下に、Intentを取得する例を示します.
@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    setContentView(R.layout.main);
 
    // Get the intent that started this activity 
    Intent intent = getIntent();
    Uri data = intent.getData();
 
    // Figure out what to do based on the intent type 
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data ... 
    } else if (intent.getType().equals("text/plain")) {
        // Handle intents with text ... 
    } 
}

設定はIntentに戻ります。


上記ではonActivity Result()でIntentをどのように処理するかを紹介しましたが、どのようにあなたのアプリケーションでこれを設定してIntentに戻りますか?呼び出したActivityに結果を返すにはsetResult()を呼び出して戻り内容を設定し、このActivityを終了します.次のコードは例です.
// 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();

以上はIntentを使って異なるActivityで情報伝達とコミュニケーションの説明を行いました.ここでIntentシリーズの文章は終わります.前の2つの文章はIntentの詳細とIntentの使用についての文章です.何か分からないことがあれば、伝言を残してください.みんなで勉強して、一緒に進歩して、ありがとうございます.
皆さんはもしプログラミングに兴味があるならば、もっと多くのプログラミングの知识を理解したいならば、プログラミングの问题を解决して、システムがある1种の开発の知识を学びたいならば、私达のここにjavaの达人がいて、C++/Cの达人、windows/Linuxの达人、android/iosの达人、みんなは私の微信の公众号に関心を持ってください:程序员のインタラクティブな连盟or coderオンライン、大牛オンラインでサービスを提供します.