1.使用intent传递数据的话,在Activity1中使用startActivity(intent)来启动活动,然后在Activity2中使用getIntent()来获取传递过来的Intent,但是如果Activity1使用的是PendingIntent来传递数据的话,在Activity2中如何获取Intent?
2.如果需要让Activity2返回数据给Activity1,则在Activity1中使用startActivityForResult方法,并实现onActivityResult方法,但是如果使用的是PendingIntent来传递数据的话该怎么办,该怎么返回数据给Activity1?
问题1分析:两种方式以同样的方法获取extra数据
PendingIntent.getActivity()
打包了一个Context.startActivity()
方法的调用,该方法告诉操作系统『我需要启动一个Activity』,随后调用PendingIntent.send()
方法时,操作系统会按照我们的要求发送原来封装的intent。所以下面的代码都可以启动目标Activity:
所以目标Activity都以同样的方式获取
extra
数据:getIntent().getExtras().getInt(key)
;但是使用PendingIntent需要特别注意:
获取的extra数据很可能是旧的
考虑这样一种使用情景:列表-详情界面,点击某个条目跳到详情界面。先点击了item 1 跳到对应的详情界面;然后点击item 2,这时仍然跳到1对应的界面。
原因是PendingIntent中的intent的extra的数据未被更新。
API这样描述
PendingIntent.getActivity()
的返回值,返回已存在的,或者匹配新参数的,『Returns an existing or new PendingIntent matching the given parameters.』那么怎样才能匹配新参数呢?把第4个参数从0改成
PendingIntent.FLAG_UPDATE_CURRENT
.为了安全因素,最好只发送显示的intent
API这样说:『For security reasons, the android.content.Intent you supply here should almost always be an explicit intent...』
具体原因不清楚,但按照API讲的去做总归是没错的。
android.app.PendingIntent源码链接
问题2分析:两种方式以同样的方法返回result
对于显示Intent:
setResult(resultCode, intent);
我仅对隐式的Intent做了测试:启动联系人列表,选择一个联系人后返回,可以获取联系人的信息:
然后在
void onActivityResult(int requestCode, int resultCode, Intent data)
中根据resultCode
做相应的处理。总结:还是让
PendingIntent
做它“字面上”该做的事情为好,比如通过AlarmManager定时做的任务,通过NotificationManager发送消息到通知栏,一种pending状态。让startActivity
启动应用内的Activity,启动其它应用:读取联系人、调用摄像头、发送社交圈,等等,需要立刻响应的任务。