intent传递map 怎样传递2个数据,给出发送端代码和接收端代码,谢谢

PendingIntent传递数据注意参数RequestCode和Flag - jing-hai - 博客园
随笔 - 246, 文章 - 44, 评论 - 7, 引用 - 0
数据发送方:
public static void notify(Context context, TxrjMessage msg) {
    NotificationManager notifiMgr = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    /*Notification notifi = new Notification(R.drawable.sms_icon,
            &短信&, System.currentTimeMillis());    */
    Notification notifi = new Notification();
    notifi.icon = R.drawable.sms_
    notifi.tickerText = msg.getBody();
    notifi.when = System.currentTimeMillis();
    /*notifi.flags = Notification.FLAG_ONGOING_EVENT
            | Notification.FLAG_NO_CLEAR | Notification.FLAG_SHOW_LIGHTS;*/
    notifi.defaults = Notification.DEFAULT_ALL;
    Intent it = new Intent(context, MessageListActivity.class);
    it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    String displayName = TextUtils.isEmpty(msg.getName()) ? msg.getNumber() : msg.getName();
    it.putExtra(TxrjConstant.EXTRA_THREAD_DISPLAY_NAME, displayName);
    it.putExtra(TxrjConstant.EXTRA_THREAD_NUMBER, msg.getNumber());
    notificationId++;
    it.putExtra(TxrjConstant.EXTRA_NOTIFICATION_ID, notificationId);
    PendingIntent pendIt = PendingIntent.getActivity(context,
            TxrjConstant.REQUEST_READ_NOTIFICATION,
            it, PendingIntent.FLAG_UPDATE_CURRENT);
    notifi.setLatestEventInfo(context, displayName, msg.getBody(), pendIt);
    notifiMgr.notify(notificationId, notifi);
数据接收方:
mThreadId = getIntent().getLongExtra(TxrjConstant.EXTRA_THREAD_ID, -1);
mDisplayName = getIntent().getStringExtra(TxrjConstant.EXTRA_THREAD_DISPLAY_NAME);
mName = getIntent().getStringExtra(TxrjConstant.EXTRA_THREAD_NAME);
mNumber = getIntent().getStringExtra(TxrjConstant.EXTRA_THREAD_NUMBER);
int notifiId = getIntent().getIntExtra(TxrjConstant.EXTRA_NOTIFICATION_ID, -1);
if(notifiId != -1) {
    NotificationManager notifiMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    notifiMgr.cancel(notifiId);
如果使用PendingIntent.FLAG_UPDATE_CURRENT,那么每次notifiId都是相同的数字,说明PendingIntent是一个,旧的参数被更新了。
如果使用PendingIntent.FLAG_ONE_SHOT,那么PendingIntent只是第一次有效,后来再点击别的Notification就无效了。
是否和getActivity的第2个参数有关系呢?
确实如此,第2个参数如果不同,那么表示PendingIntent不同,就不会出现上述两种情况。
将发送方蓝色部分代码改成
PendingIntent pendIt = PendingIntent.getActivity(context,
        notificationId, it,
        PendingIntent.FLAG_ONE_SHOT);
这里使用FLAG_ONE_SHOT是正确有效的。如日志所示。
07-21 02:59:52.154: E/txrjsms(17085): ShowSmsActivity.onDestroy
07-21 02:59:57.749: E/txrjsms(17085): MessageListActivity.onCreate
07-21 02:59:57.910: I/txrjsms(17085): notifiId:1
07-21 02:59:58.260: E/txrjsms(17085): MessageListActivity.onStart
07-21 02:59:58.260: E/txrjsms(17085): MessageListActivity.onResume
07-21 03:00:01.353: E/txrjsms(17085): MessageListActivity.onPause
07-21 03:00:01.943: E/txrjsms(17085): MessageListActivity.onStop
07-21 03:00:01.943: E/txrjsms(17085): MessageListActivity.onDestroy
07-21 03:00:04.536: E/txrjsms(17085): MessageListActivity.onCreate
07-21 03:00:04.726: I/txrjsms(17085): notifiId:2
07-21 03:00:04.956: E/txrjsms(17085): MessageListActivity.onStart
07-21 03:00:04.956: E/txrjsms(17085): MessageListActivity.onResume
07-21 03:00:06.748: E/txrjsms(17085): MessageListActivity.onPause
07-21 03:00:07.279: E/txrjsms(17085): MessageListActivity.onStop
07-21 03:00:07.279: E/txrjsms(17085): MessageListActivity.onDestroy
07-21 03:00:09.541: E/txrjsms(17085): MessageListActivity.onCreate
07-21 03:00:09.591: I/txrjsms(17085): notifiId:3
07-21 03:00:09.941: E/txrjsms(17085): MessageListActivity.onStart
07-21 03:00:09.951: E/txrjsms(17085): MessageListActivity.onResume
07-21 03:00:12.213: E/txrjsms(17085): MessageListActivity.onPause
07-21 03:00:12.844: E/txrjsms(17085): MessageListActivity.onStop
07-21 03:00:12.844: E/txrjsms(17085): MessageListActivity.onDestroy
将FLAG_ONE_SHOT改FLAG_UPDATE_CURRENT测验一下!
PendingIntent pendIt = PendingIntent.getActivity(context,
        notificationId, it,
        // PendingIntent.FLAG_ONE_SHOT);
        PendingIntent.FLAG_UPDATE_CURRENT);
下面的日志表示:FLAG_UPDATE_CURRENT照样OK!
07-21 03:07:03.034: E/txrjsms(18079): MessageListActivity.onCreate // 准备发送短信
07-21 03:07:03.174: I/txrjsms(18079): notifiId:-1
07-21 03:07:03.224: E/txrjsms(18079): MessageListActivity.onStart
07-21 03:07:03.224: E/txrjsms(18079): MessageListActivity.onResume
07-21 03:07:15.757: E/txrjsms(18079): MessageListActivity.onPause
07-21 03:07:17.268: E/txrjsms(18079): MessageListActivity.onStop
07-21 03:07:17.268: E/txrjsms(18079): MessageListActivity.onDestroy // 关闭信息列表界面
07-21 03:08:01.621: E/txrjsms(18079): ShowSmsActivity.onDestroy // 关闭新信息的弹窗
07-21 03:09:39.917: E/txrjsms(18079): MessageListActivity.onCreate // 查看第3个短信通知
07-21 03:09:40.047: I/txrjsms(18079): notifiId:3
07-21 03:09:40.378: E/txrjsms(18079): MessageListActivity.onStart // onCreate之后就是onStart
07-21 03:09:40.378: E/txrjsms(18079): MessageListActivity.onResume
07-21 03:10:28.835: E/txrjsms(18079): MessageListActivity.onPause // 展开状态栏
07-21 03:10:28.835: E/txrjsms(18079): MessageListActivity.onNewIntent // 查看第2个短信通知
07-21 03:10:28.835: I/txrjsms(18079): notifiId:2
07-21 03:10:28.965: E/txrjsms(18079): MessageListActivity.onResume // onNewIntent之后就是onResume
07-21 03:12:48.401: E/txrjsms(18079): MessageListActivity.onPause // 展开状态栏
07-21 03:12:48.401: E/txrjsms(18079): MessageListActivity.onNewIntent // 查看第1个短信通知
07-21 03:12:48.401: I/txrjsms(18079): notifiId:1
07-21 03:12:48.561: E/txrjsms(18079): MessageListActivity.onResume // onNewIntent之后就是onPause
07-21 03:14:31.242: E/txrjsms(18079): MessageListActivity.onPause // 点击HOME键
07-21 03:14:31.712: E/txrjsms(18079): MessageListActivity.onStop
07-21 03:15:02.332: E/txrjsms(18079): MessageListActivity.onRestart // 点击应用图标,启动栈顶的那个Activity
07-21 03:15:02.332: E/txrjsms(18079): MessageListActivity.onStart
07-21 03:15:02.332: E/txrjsms(18079): MessageListActivity.onResume
07-21 03:16:38.286: E/txrjsms(18079): MessageListActivity.onPause // 点击BACK键
07-21 03:16:38.826: E/txrjsms(18079): MessageListActivity.onStop
07-21 03:16:38.826: E/txrjsms(18079): MessageListActivity.onDestroy23:25 提问
Android Intent 如何接收到指定的Intent传递过来的值呢?
写了2个Activity,A、B,2个Activity之间可以相互跳转。
1、A中有一个发送按钮可实现传值到B中,同时还有一个独立的跳转按钮。
2、在B中有接收A传值过来的的代码
3、执行中,如果直接执行了跳转按钮,B的接收Intent代码中,就会出现空指针异常,目前通过 try{}catch临时确保能正常运行。
想请问:能否有方法可以让B接收传值的代码能够识别那个Intent才是传值过来的,避免空指针异常出现。
A传值代码如下:
* 1、获取到界面中输入的信息
* 2、将获取到的值,传递到ReceiveActivity中。
Button _OkSend = (Button)findViewById(R.id.buttonOkSend);
_OkSend.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EditText editText1 = (EditText)findViewById(R.id.editText);
name=editText1.getText().toString();
Log.i("YuryLog","SendActivity name: "+name);
EditText editText2 = (EditText)findViewById(R.id.editText2);
eatSomething = editText2.getText().toString();
Log.i("YuryLog","SendActivity eatSomething: "+eatSomething);
EditText editText3 = (EditText)findViewById(R.id.editText3);
copies = editText3.getText().toString();
Log.i("YuryLog","SendActivity copies: "+copies);
将值传递到ReceiveActivity中
Intent _intent = new Intent(SendActivity.this, ReceiveActivity.class) ;
_intent.putExtra("sendName",name);
_intent.putExtra("sendeatSomething",eatSomething);
_intent.putExtra("sendcopies",copies);
startActivity(_intent);
B接收代码如下:
接收SendActivity中传递过来的值;
需要确定,只有SendActivity中传递过来的值才能触发,否则第一次执行的时候会出现空指针异常;
Intent _getIntent = this.getIntent();
if( _getIntent.getExtras().getString("sendName") != null){
Log.i("YuryLog","理论上只有点了确认键才执行");
receiveName = _getIntent.getExtras().getString("sendName");
receiveEatSomething = _getIntent.getExtras().getString("sendeatSomething");
receiveCopies = _getIntent.getExtras().getString("sendcopies");
Log.i("YuryLog",receiveName + receiveEatSomething + receiveCopies);
在界面中显示接收到的值
获取到TextView的id,再动态的更改它的值
TextView _textView =(TextView) findViewById(R.id.textView4);
TextView _textView2 =(TextView) findViewById(R.id.textView5);
_textView.setText(receiveName+": ");
_textView2.setText("来" + receiveCopies + "份" + receiveEatSomething);
}catch (Exception e){
e.printStackTrace();
万分感谢各位能提供一个思路,谢谢。
按赞数排序
首先,尽量不要用try{}catch去捕捉能用判断规避的异常,那样会影响效率,每次出现异常,虚拟机要抓错误调用堆栈。所以,最好的方式是通过判断去规避。
按你的思路,可以先判断getIntent.getExtras()是否为null。
Intent _getIntent = this.getIntent();
if( _getIntent.getExtras() != null){
Log.i("YuryLog","理论上只有点了确认键才执行");
receiveName = _getIntent.getExtras().getString("sendName");
receiveEatSomething = _getIntent.getExtras().getString("sendeatSomething");
receiveCopies = _getIntent.getExtras().getString("sendcopies");
要指出的是,上述代码,最好使用getXXXExtra这类方法,它不会出现空指针(除了少数几个,比方说getStringExtra)。
需要设定默认值的,在没有值时它会返回默认值;没有设置默认值的,在没有值时会返回null,针对这类判空一下。
可以看下getBooleanExtra的源码:
public boolean getBooleanExtra(String name, boolean defaultValue) {
return mExtras == null ? defaultValue :
mExtras.getBoolean(name, defaultValue);
而getExtras()在没有值时会返回null,看下源码:
public Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
所以,最好不要用getIntent().getExtras()这种方式,换用getIntent().getXXXExtras(),这样针对有设置默认值的就不需要判空了。
activity之间传值,是没有机制可以确定哪个activity传过来的。这是考虑到代码的可扩展性,解耦。要确定哪个activity发过来,在intent创建那里多传个布尔值就行,比方说下面的代码。
intent.putExtra("fromXXActivity", true);
if (getIntent().getBooleanExtra("fromXXActivity", false)) {
// 这里,你就可以安全的接收那个activity发过来的所有值。
使用Bundle来传递数据...具体可以百度Bundle的用法...
大概是这样:
1、传数据:
Bundle bundle = new Bundle();
bundle.putString("itemName", "name");
bundle.putString("itemClass", "class");
Intent intent = new Intent();
intent.setClass(MainActivity.this, InformationActivity.class);
intent.putExtras(bundle);
startActivityForResult(intent, 1);
2、收数据方:
Bundle bundle = this.getIntent().getExtras();
String name = bundle.getString("itemName");
String cla = bundle.getString("itemClass");
简单来说就是通过关键字来区分
13229关注|1531收录
其他相似问题
相关参考资料3652人阅读
android(7)
首先需要用到函数有:
startActivityForResult;
public final void setResult(int resultCode, String data)
protected void onActivityResult(int requestCode, int resultCode, Intent data)
例如 A 到 B, 从 B 得到 A 的数据:
static final int RG_REQUEST = 0; //判断回调函数的值
Intent intent = new Intent();
intent.setClass(A.this, B.class);
startActivityForResult(intent,RG_REQUEST);
//在 B 中处理
Bundle bundle = new Bundle();
bundle.putString(&DataKey&, edittext.getText().toString());//给 bundle 写入数据
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
//最后在 A 的回调函数里面接收数据
if (requestCode == RG_REQUEST) {
if (resultCode == RESULT_CANCELED)
setTitle(&Canceled...&);
else if(resultCode == RESULT_OK) {
setTitle((String)data.getCharSequenceExtra(&DataKey&));
http://download.csdn.net/detail/dannor
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:72785次
积分:1066
积分:1066
排名:千里之外
原创:30篇
评论:73条
(1)(1)(1)(1)(23)(2)(1)(1)安卓客户端发送的一段代码,求json大神指导,服务端的servlet怎么接收这个数据并打印出来_百度知道
安卓客户端发送的一段代码,求json大神指导,服务端的servlet怎么接收这个数据并打印出来
卓客户端的代码如下://192;://192.101.090).put(&quot.length &
HttpPost post = new HttpPost(&).0.168; 1){
if(params, 1:8080/firstweb/hello1&
JSONObject json = new JSONObject()
提问者采纳
参数名&quotJSONObject只是对字符串的封装罢了;),用获取字符串的方法获取json即可request.getParameter(&quot
提问者评价
来自团队:
其他类似问题
为您推荐:
json的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁今天看啥 热点:
Intent传输数据的几种机制,intent传输机制1.Intent是什么
Intent是视图的意思,它是Android应用内不同组件之间通信的载体。当Android运行时需要连接不同的组件时,通常就需要借助于Intent来实现。Intent可以启动应用中另一个Activity,也可以启动一个Service组件,还可以发送一条广播消息来触发系统中的BroadcastReceiver。Activity,Service和BroadcastReceiver三个组件之间的通信都以Intent作为载体。
(1)启动一个Activity时,可以调用Context的startActivity(Intent intent)或者Activity的startActivityForResult(Intent intent,int requestCode),参数intent封装了需要启动的Activity的信息。
(2)启动一个Service时,可以调用Context的startService(Intent intent)的方法或bindService(Intent service,ServiceConnection conn,int flags)方法,Intent参数封装了需要启动的目标Service的信息。
(3)触发一个BroadcastReceiver时,可以调用Context的sendBroadcast(Intent intent),sendStickyBroadcast()或sendOrderedBroadcast(),这三个方法中的Intent参数封装了需要触发的目标BroadcastReceiver的信息。
2.Intent存的是什么信息:(自己理解)Intent中存的信息包括本Activity的信息以及将要跳转的Activity的信息。
3.显式Intent和隐式Intent 显式Intent:决定目标组件的唯一要素是组件名称。更多的用在应用程序内部传递信息。
4.Intent解析机制:Android是通过Intent的action,type和category来判断的。 隐式Intent:没有明确指出组件名称,由Android系统帮助程序寻找与Intent请求意图最匹配的组件。Android系统使用IntentFilter来寻找与隐式Intent相关的对象。更多的用在不同应用程序传递信息:例如跳转到打开音乐播放器,打开图库等。
5.Intent启动Activity的方式。
startActivity()是异步操作,开启新的ActivityB和原的ActivityA同时执行。 startActivityForResult()是同步操作,ActivityA在开启新的ActivityB后将自己阻塞,ActivityB退出以后ActivityA才继续执行,并根据ActivityB返回的结果执行下一步的操作。
(1)使用startActivity(Intent intent)直接启动。
(2)使用startActivityForResult(Intent intent, Int requestCode),setResult(int resultCode, Intent intent),onActivityResult(int requestCode, int resultCode, Intent intent)
A通过startActivityForResult()开启B的流程。
a.首先在A中调用startActivityForResult(Intent intent, Int requestCode)。
Intent参数代表的是一个普通的intent,例如:从A跳到B,可以Intent intent = new Intent(A.cthis,B.class); intent指定了要跳转到B,且包含了A传给B的数据。requestCode&=0,如果A还要跳转到C,D等等,requestCode就对应不同的值。例如:从A跳转到B,C,D等等,可以分别用1,2,3等等来区分。在后面的onActivityResult()中需要以此来区分各个Activity传回的结果。
  //startActivityForResult(intent,1);
  //startActivityForResult(intent,2);
  //startActivityForResult(intent,3);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
b.在B中setResult(int resultCode, Intent intent)。
resultCode用来区分B有几种不同的返回结果。
intent(本例子)参数代表的是返回A,主要用来返回额外的数据,最终会传给A的onActivityResult()
c.最后在A中调用onActivityResult(int requestCode, int resultCode, Intent data)   
requestCode :区分是哪个Activity传回来的   
requestCode :区分传给哪个Activity   
data : B中调用setResult时传回的那个intent。
6.Intent传递数据的方式。
(1)putXXXExtra(&key&,&value&);
(2)先new一个Bundle的对象,Bundle用来携带数据。然后在调用intent.putExtras(bundle);
(3)Intent要求传送的数据必须实现实现Serializable接口或者Parcelable接口中的一种。
7.Intent传递数据的类型。
(1)Integer类型的ArrayList
(2)String类型的ArrayList
(3)其他类型(其他类型好像只可以用串行化),要引用Serializable接口。Serializable接口就是java提供的通用数据保存和读取的接口。任何类型只要实现了Serializable接口就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以通过管道传输到系统的其他程序中。Serializable不仅可以本机使用还可以经由网路操作(RMI)。这样的好处是自动屏蔽了操作系统的差异。
1. 使用Intent来传递数据Intent表示意图,很多时候我们都会利用Android的Intent来在各个Activity之间传递数据,这也是Android比较官方的一种数据传递的方式需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),其中利用Intent来传递数据程序Demo如下:IntentDemo.javapackage com.android. import android.app.A import android.content.I import android.os.B import android.view.V import android.widget.B public class IntentDemo extends Activity { private B @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initComponent(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(IntentDemo.this, Other.class); // 在Intent中传递数据 intent.putExtra(&name&, &AHuier&); intent.putExtra(&age&, 22); intent.putExtra(&address&, &XiaMen&); // 启动Intent startActivity(intent); } }); } private void initComponent() { button = (Button) findViewById(R.id.button); } } other.javapackage com.android. import android.app.A import android.content.I import android.os.B import android.widget.TextV public class Other extends Activity { private TextView textV @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.other); initComponent(); Intent intent = getIntent(); int age = intent.getIntExtra(......余下全文>>
在android系统中的intent对象是不支持直接传递int数据类型的,那么解决这类问题有两种方法:一是通过数据类型转换,不过在有些特殊的情况下这种方法并不适用;二是通过bundle这个对象来封装数据进行传递,例如发送端: Bundle bundle = new Bundle();bundle.putInt(&deptname&, 3);intent.putExtras(bundle);这样就可以解决问题。
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
Java编程最近更新}

我要回帖

更多关于 intent传递map 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信