【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オンライン、大牛オンラインでサービスを提供します.