• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=获取Activity的结果
2page.tags=意向
3helpoutsWidget=true
4
5trainingnavtop=true
6
7@jd:body
8
9<div id="tb-wrapper">
10  <div id="tb">
11
12<h2>本课程将向您展示如何</h2>
13<ol>
14  <li><a href="#StartActivity">开始Activity</a></li>
15  <li><a href="#ReceiveResult">接收结果</a></li>
16</ol>
17
18<h2>您还应阅读</h2>
19<ul>
20    <li><a href="{@docRoot}training/sharing/index.html">共享简单数据</a></li>
21    <li><a href="{@docRoot}training/secure-file-sharing/index.html">共享文件</a>
22</ul>
23
24  </div>
25</div>
26
27<p>开始并不一定是单向的另一个Activity。您还可以开始另一个Activity并
28接收返回的结果。要接收结果,请调用 {@link android.app.Activity#startActivityForResult
29startActivityForResult()}(而不是 {@link android.app.Activity#startActivity
30startActivity()})。</p>
31
32<p>例如,您的应用可启动照相机应用并接收拍摄的照片作为结果。或者,您可以启动“联系人”应用以便用户选择联系人,并且您将接收联系人详细信息作为结果。
33
34</p>
35
36<p>当然,响应的Activity必须设计为返回结果。当它这样做时,它会作为另一
37 {@link android.content.Intent} 对象发送结果。您的Activity在
38{@link android.app.Activity#onActivityResult onActivityResult()} 回调中接收它。</p>
39
40<p class="note"><strong>注意:</strong>当您调用
41{@link android.app.Activity#startActivityForResult startActivityForResult()} 时,您可以使用明确或隐含意向。当开始您自己的Activity以接收结果时,您应使用明确意向确保您可收到预期结果。
42
43</p>
44
45
46<h2 id="StartActivity">开始Activity</h2>
47
48<p> 开始针对结果的Activity时,您所使用的 {@link android.content.Intent} 对象并没有什么特别之处,但您需要向 {@link
49android.app.Activity#startActivityForResult startActivityForResult()} 方法传递额外的整数参数。
50</p>
51
52<p>该整数参数是识别您的请求的“请求代码”。当您收到结果{@link android.content.Intent} 时,回调提供相同的请求代码,以便您的应用可以正确识别结果并确定如何处理它。
53
54</p>
55
56<p>例如,此处显示如何开始允许用户选择联系人的Activity:</p>
57
58<pre>
59static final int PICK_CONTACT_REQUEST = 1;  // The request code
60...
61private void pickContact() {
62    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
63    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
64    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
65}
66</pre>
67
68
69<h2 id="ReceiveResult">接收结果</h2>
70
71<p>当用户完成后续Activity并且返回时,系统会调用您的Activity
72{@link android.app.Activity#onActivityResult onActivityResult()} 的方法。此方法包括三个参数:
73</p>
74
75<ul>
76  <li>您向 {@link
77android.app.Activity#startActivityForResult startActivityForResult()} 传递的请求代码。</li>
78  <li>第二个Activity指定的结果代码。如果操作成功,这是 {@link
79android.app.Activity#RESULT_OK};如果用户退出或操作出于某种原因失败,则是 {@link
80android.app.Activity#RESULT_CANCELED}。
81</li>
82  <li>传送结果数据的 {@link android.content.Intent}。</li>
83</ul>
84
85<p>本例说明您可以如何处理“选择联系人”意向的结果。</p>
86
87<pre>
88&#64;Override
89protected void onActivityResult(int requestCode, int resultCode, Intent data) {
90    // Check which request we're responding to
91    if (requestCode == PICK_CONTACT_REQUEST) {
92        // Make sure the request was successful
93        if (resultCode == RESULT_OK) {
94            // The user picked a contact.
95            // The Intent's data Uri identifies which contact was selected.
96
97            // Do something with the contact here (bigger example below)
98        }
99    }
100}
101</pre>
102
103<p>在本例中, Android 的“联系人”应用返回的结果 {@link android.content.Intent} 提供识别用户所选联系人的内容 {@link android.net.Uri}。
104
105</p>
106
107<p>为了成功处理结果,您必须了解结果的
108{@link android.content.Intent} 的格式。当返回结果的Activity是您自己的Activity之一时,这便非常容易。
109Andriod 平台附带的应用提供它们自己的 API,您可用这些 API 获取特定结果数据。
110例如,“联系人” 应用(在一些较旧的版本中是 Contacts 应用)始终返回带内容 URI(识别所选联系人)的结果,并且“照相机” 应用在 {@code "data"} 额外项中返回 {@link android.graphics.Bitmap}(请参阅有关
111<a href="{@docRoot}training/camera/index.html">拍摄照片</a>的课程)。
112
113</p>
114
115
116<h4>奖励:接收联系人数据</h4>
117
118<p>显示如何从“联系人”应用获取结果的代码不会详细说明如何实际从结果读取数据,但它需要对<a href="{@docRoot}guide/topics/providers/content-providers.html">内容提供商</a>进行更深入的探讨。
119
120
121但是,如果您很好奇,此处提供了更多的代码向您展示如何查询结果数据,从所选联系人获取电话号码:
122</p>
123
124<pre>
125&#64;Override
126protected void onActivityResult(int requestCode, int resultCode, Intent data) {
127    // Check which request it is that we're responding to
128    if (requestCode == PICK_CONTACT_REQUEST) {
129        // Make sure the request was successful
130        if (resultCode == RESULT_OK) {
131            // Get the URI that points to the selected contact
132            Uri contactUri = data.getData();
133            // We only need the NUMBER column, because there will be only one row in the result
134            String[] projection = {Phone.NUMBER};
135
136            // Perform the query on the contact to get the NUMBER column
137            // We don't need a selection or sort order (there's only one result for the given URI)
138            // CAUTION: The query() method should be called from a separate thread to avoid blocking
139            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
140            // Consider using {@link android.content.CursorLoader} to perform the query.
141            Cursor cursor = getContentResolver()
142                    .query(contactUri, projection, null, null, null);
143            cursor.moveToFirst();
144
145            // Retrieve the phone number from the NUMBER column
146            int column = cursor.getColumnIndex(Phone.NUMBER);
147            String number = cursor.getString(column);
148
149            // Do something with the phone number...
150        }
151    }
152}
153</pre>
154
155<p class="note"><strong>注意:</strong>在 Android 2.3(API 级别 9)之前, 在 {@link android.provider.ContactsContract.Contacts Contacts Provider} 上执行查询(如以上所示)需要您的应用声明 {@link
156android.Manifest.permission#READ_CONTACTS} 权限(请参阅<a href="{@docRoot}guide/topics/security/security.html">安全与权限</a>)。
157
158但是,自 Android 2.3 版本开始,“联系人”应用授予您的应用在联系人提供商向您返回结果时从联系人提供商临时读取信息的权限。
159
160该临时权限仅适用于所请求的特定联系人,因此您只能查询意向的 {@link android.net.Uri} 指定的联系人,除非您声明 {@link
161android.Manifest.permission#READ_CONTACTS} 权限。
162
163</p>
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179