summaryrefslogtreecommitdiffstats
path: root/docs/html-intl/intl/zh-cn/training/basics/intents/result.jd
blob: 35b267368466a14a82bb50e10bbaa41c99c09d97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
page.title=获取Activity的结果
page.tags=意向
helpoutsWidget=true

trainingnavtop=true

@jd:body

<div id="tb-wrapper">
  <div id="tb">

<h2>本课程将向您展示如何</h2>
<ol>
  <li><a href="#StartActivity">开始Activity</a></li>
  <li><a href="#ReceiveResult">接收结果</a></li>
</ol>

<h2>您还应阅读</h2>
<ul>
    <li><a href="{@docRoot}training/sharing/index.html">共享简单数据</a></li>
    <li><a href="{@docRoot}training/secure-file-sharing/index.html">共享文件</a>
</ul>

  </div>
</div>

<p>开始并不一定是单向的另一个Activity。您还可以开始另一个Activity并
接收返回的结果。要接收结果,请调用 {@link android.app.Activity#startActivityForResult
startActivityForResult()}(而不是 {@link android.app.Activity#startActivity
startActivity()})。</p>

<p>例如,您的应用可启动照相机应用并接收拍摄的照片作为结果。或者,您可以启动“联系人”应用以便用户选择联系人,并且您将接收联系人详细信息作为结果。

</p>

<p>当然,响应的Activity必须设计为返回结果。当它这样做时,它会作为另一
 {@link android.content.Intent} 对象发送结果。您的Activity在
{@link android.app.Activity#onActivityResult onActivityResult()} 回调中接收它。</p>

<p class="note"><strong>注意:</strong>当您调用
{@link android.app.Activity#startActivityForResult startActivityForResult()} 时,您可以使用明确或隐含意向。当开始您自己的Activity以接收结果时,您应使用明确意向确保您可收到预期结果。

</p>


<h2 id="StartActivity">开始Activity</h2>

<p> 开始针对结果的Activity时,您所使用的 {@link android.content.Intent} 对象并没有什么特别之处,但您需要向 {@link
android.app.Activity#startActivityForResult startActivityForResult()} 方法传递额外的整数参数。
</p>

<p>该整数参数是识别您的请求的“请求代码”。当您收到结果{@link android.content.Intent} 时,回调提供相同的请求代码,以便您的应用可以正确识别结果并确定如何处理它。

</p>

<p>例如,此处显示如何开始允许用户选择联系人的Activity:</p>

<pre>
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);
}
</pre>


<h2 id="ReceiveResult">接收结果</h2>

<p>当用户完成后续Activity并且返回时,系统会调用您的Activity
{@link android.app.Activity#onActivityResult onActivityResult()} 的方法。此方法包括三个参数:
</p>

<ul>
  <li>您向 {@link
android.app.Activity#startActivityForResult startActivityForResult()} 传递的请求代码。</li>
  <li>第二个Activity指定的结果代码。如果操作成功,这是 {@link
android.app.Activity#RESULT_OK};如果用户退出或操作出于某种原因失败,则是 {@link
android.app.Activity#RESULT_CANCELED}。
</li>
  <li>传送结果数据的 {@link android.content.Intent}。</li>
</ul>

<p>本例说明您可以如何处理“选择联系人”意向的结果。</p>

<pre>
&#64;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)
        }
    }
}
</pre>

<p>在本例中, Android 的“联系人”应用返回的结果 {@link android.content.Intent} 提供识别用户所选联系人的内容 {@link android.net.Uri}。

</p>

<p>为了成功处理结果,您必须了解结果的
{@link android.content.Intent} 的格式。当返回结果的Activity是您自己的Activity之一时,这便非常容易。
Andriod 平台附带的应用提供它们自己的 API,您可用这些 API 获取特定结果数据。
例如,“联系人” 应用(在一些较旧的版本中是 Contacts 应用)始终返回带内容 URI(识别所选联系人)的结果,并且“照相机” 应用在 {@code "data"} 额外项中返回 {@link android.graphics.Bitmap}(请参阅有关
<a href="{@docRoot}training/camera/index.html">拍摄照片</a>的课程)。

</p>


<h4>奖励:接收联系人数据</h4>

<p>显示如何从“联系人”应用获取结果的代码不会详细说明如何实际从结果读取数据,但它需要对<a href="{@docRoot}guide/topics/providers/content-providers.html">内容提供商</a>进行更深入的探讨。


但是,如果您很好奇,此处提供了更多的代码向您展示如何查询结果数据,从所选联系人获取电话号码:
</p>

<pre>
&#64;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 {@link android.content.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...
        }
    }
}
</pre>

<p class="note"><strong>注意:</strong>在 Android 2.3(API 级别 9)之前, 在 {@link android.provider.ContactsContract.Contacts Contacts Provider} 上执行查询(如以上所示)需要您的应用声明 {@link
android.Manifest.permission#READ_CONTACTS} 权限(请参阅<a href="{@docRoot}guide/topics/security/security.html">安全与权限</a>)。

但是,自 Android 2.3 版本开始,“联系人”应用授予您的应用在联系人提供商向您返回结果时从联系人提供商临时读取信息的权限。

该临时权限仅适用于所请求的特定联系人,因此您只能查询意向的 {@link android.net.Uri} 指定的联系人,除非您声明 {@link
android.Manifest.permission#READ_CONTACTS} 权限。

</p>