如何使用 Bundle 传递数据

如何使用 Bundle 传递数据,第1张

从源请求Activity 中通过一个Intent 把一个服务请求传到目标Activity 中

//从Intent 中获取数据

Bundle myBundelForGetName=thisgetIntent()getExtras();

String name=myBundelForGetNamegetString("Key_Name");

myTextView_showNamesetText("欢迎您进入:"+name);

private Intent toNextIntent;//Intent 成员声明

toNextIntent=new Intent();//Intent 定义

toNextIntentsetClass(TwoActivityME3this, SecondActivity3class);

//设定开启的下一个Activity

startActivityForResult(toNextIntent, REQUEST_ASK););

开启Intent 时候,把请求码同时传递在源请求Activity 中等待Intent 返回应答结果,通过重载onActivityResult()方法

直接上代码

第一个类是点击传值

public class MainActivity extends Activity {

private Button btn=null;

public void onCreate(Bundle savedInstanceState)//onCreate方法用来初始化Activity实例对象

{

superonCreate(savedInstanceState);//superonCreate(savedInstanceState)的作用是调用其父类Activity的onCreate方法来实现对界面的图画绘制工作

setContentView(Rlayoutactivity_main);//setContentView(Rlayoutmain)的作用是加载一个界面

btn=(Button)findViewById(Ridbtn);

btnsetOnClickListener(listener);

}

private ViewOnClickListener listener=new ViewOnClickListener()

{

@Override

public void onClick(View v)

{

// Intent intent=new Intent();

// intentsetAction(IntentACTION_SENDTO);

// intentsetData(Uriparse("smsto:5554"));

// intentputExtra("sms_body", "Hello!");//sms_body不能随意换成

// startActivity(intent);

Intent intent=new Intent();

intentsetClass(MainActivitythis, SecondActivityclass);//从一个activity跳转到另一个activity

intentputExtra("str", "Intent Demo");//给intent添加额外数据,key为“str”,key值为"Intent Demo"

startActivity(intent);

}

};

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater()inflate(Rmenuactivity_main, menu);

return true;

}

}

第二个获取传过来的值展示

public class SecondActivity extends Activity

{

private TextView secondTxt;

@Override

protected void onCreate(Bundle savedInstanceState)

{

// TODO Auto-generated method stub

superonCreate(savedInstanceState);

setContentView(Rlayoutsecond);

Intent intent=getIntent();//getIntent将该项目中包含的原始intent检索出来,将检索出来的intent赋值给一个Intent类型的变量intent

Bundle bundle=intentgetExtras();//getExtras()得到intent所附带的额外数据

String str=bundlegetString("str");//getString()返回指定key的值

secondTxt=(TextView)findViewById(RidsecondTxt);//用TextView显示值

secondTxtsetText(str);

}

}

布局文件就一个按钮一个TextView

以下内容为CSDN上(网名:yuan1590)对安卓显示意图和隐身意图的总结(ps前人种树,树,后人乘凉,所以我就粘过来了,希望帮到您):

1 Intent

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,

Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动作和产生事件。

使用 Intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)。

2 显式意图、隐式意图

Intent可以划分成显式意图和隐式意图。

显式意图:调用IntentsetComponent() 或 IntentsetClassName() 或 IntentsetClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

如: 在 MainActicity 中打开一个新的 Acticity -- OtherActivity

1 Intent intent = new Intent();

2 intentsetComponent(new ComponentName(MainActivitythis, OtherActivityclass));

3 第二行代码可以更换为:intentsetClass(MainActivitythis, OtherActivityclass);

4 也可以使用构造器来指定组件: Intent intent = new Intent(MainActivitythis, OtherActivityclass)

三种 “显式意图” 指定方式等价

隐式意图:没有明确指定组件名的Intent为隐式意图。

Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图

例如拨打电话的意图:

Uri uri = Uriparse("tel:" + phoneCode);

Intent intent = new Intent(IntentACTION_CALL, uri);

对于隐式意图,Android是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。

动作测试(Action test)

一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:

+ 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。

<intent-filter><!-- 空的 --></intent-filter>

+ 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试

类别测试(Category test)

对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。

原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。

但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"androidintentcategoryDEFAULT" (CATEGORY_DEFAULT常量)。

因此自定义 Activity 的时候,不要以为光定义一个 action 就够了。这样用 startActivity() 来激活这个 Activity 的时候将一直报错。

原因就是,他内部要求去匹配 androidintentcategoryDEFAULT 这个类别。

因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"androidintentcategoryDEFAULT"。

(带"androidintentactionMAIN"和"androidintentcategoryLAUNCHER"设置的过滤器是例外)

数据测试(Data test)

当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。

例如,如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;

如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;

如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。

当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

数据测试同时比较意图对象和过滤器中指定的URI和数据类型。规则如下:

a 一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。

b 一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。

这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。

c 一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。

d 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。

如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。

换句话说,一个组件被假定为支持content:和file: 数据如果它的过滤器仅列举了一个数据类型。

以上就是关于如何使用 Bundle 传递数据全部的内容,包括:如何使用 Bundle 传递数据、activity间怎么传递acitvity或class或content、android 显示intent和隐士inent的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9440659.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存