如何在Android开发中activity之间数据传递

如何在Android开发中activity之间数据传递,第1张

android各组件之间可以使用Intent来传递数据, 这里以ActivityA向ActivityB传递数据为例

Intent intent = new Intent(context, ActivityBclass);

//如果context上下文不是Activity的话, 需要添加下面这个flag,

if (!(context instanceof Activity)) {

   intentaddFlags(IntentFLAG_ACTIVITY_NEW_TASK);

}

//添加要传递的数据

//这里的key到时候ActivityB会用来得到value

//android要求可以传递的数据类型包括基本数据类型,

//基本数据类型的数组,CharSequence,以及实现了Parcelable的对象

//putExtra是重载方法, 根据value的类型会适当的打包进intent的Bundle对象里

intentputExtra(key, value);

//或则将数据打包进Bundle data里, 然后intentputExtras(data);

contextstartActivity(intent);

在ActivityB中

public void onCreate(Bundle savedInstanceState) {

    //得到传递过来的数据

    Bundle bundle = getIntent()getExtras();

    //通过getXXX方法来获取key对应的value

    bundlegetXXX(key);

}

安卓独有的一个工具:广播;

发送方:

Intent

intent

=

new

Intent();

intentsetAction("eventdetailsmatch");

sendBroadcast(intent);

接收方:

//

注册广播接收

MatchReceiveBroadCast

mr

=

new

MatchReceiveBroadCast();

IntentFilter

filter

=

new

IntentFilter();

filteraddAction("eventdetailsmatch");

getActivity()registerReceiver(mr,

filter);

//

广播类

public

class

MatchReceiveBroadCast

extends

BroadcastReceiver

{

@Override

public

void

onReceive(Context

context,

Intent

intent)

{

//

TODO

Auto-generated

method

stub

//

获取广播中的数据,取出

String

times

=

intentgetStringExtra("time");

timesetText("比赛时间:"

+

times);

}

}

如果将activity的launchMode设置为singleTask,会发现收不到intent传递过来的值,这时候就需要使用到onNewIntent方法,在里面接收intent。

launchMode为singleTask的时候,通过Intent启到一个Activity,如果 系统 已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法,如下所示:

1 protected void onNewIntent(Intent intent) {

2   superonNewIntent(intent);

3   setIntent(intent);//must store the new intent unless getIntent() will return the old one

4   processExtraData();

5 }

同时,系统可能会随时杀掉后台运行的activity,那么系统就会调用onCreate方法,而不调用onNewIntent方法,因此需要在onCreate和onNewIntent方法中调用同一个处理数据的方法,如下所示:

01 public void onCreate(Bundle savedInstanceState) {

02   superonCreate(savedInstanceState);

03   setContentView(Rlayoutmain);

04   processExtraData();

05 }

06  

07 protected void onNewIntent(Intent intent) {

08   superonNewIntent(intent);

09   setIntent(intent);//must store the new intent unless getIntent() will return the old one

10   processExtraData()

11 }

12  

13 private void processExtraData(){

14   Intent intent = getIntent();

15   //use the data received here

16 }

@Override

publicvoidonResume(){

superonResume();

// 第一次进入这个页面,下面的方法是不会执行的,因为ringName是null

String ringName = getActivity()getIntent()getStringExtra("ringName");

if(ringName !=null) {

newSoundsetText(ringName);

Loge("tag", ringName +"要保存的值");

SharedPreferenceUtilsetString(getActivity(),

SharedPreferenceUtilRINGTONE_NAME, ringName);

}

}

注意,这里Fragment调用的时候,一定要在onResume方法中。

>

1 使用Intent来传递数据Intent表示意图,很多时候我们都会利用Android的Intent来在各个Activity之间传递数据,这也是Android比较官方的一种数据传递的方式需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),其中利用Intent来传递数据程序Demo如下:IntentDemojavapackage comandroidintentdemo; import androidappActivity; import androidcontentIntent; import androidosBundle; import androidviewView; import androidwidgetButton; public class IntentDemo extends Activity { private Button button; @Override public void onCreate(Bundle savedInstanceState) { superonCreate(savedInstanceState); setContentView(Rlayoutmain); initComponent(); buttonsetOnClickListener(new ViewOnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(IntentDemothis, Otherclass); // 在Intent中传递数据 intentputExtra("name", "AHuier"); intentputExtra("age", 22); intentputExtra("address", "XiaMen"); // 启动Intent startActivity(intent); } }); } private void initComponent() { button = (Button) findViewById(Ridbutton); } } otherjavapackage comandroidintentdemo; import androidappActivity; import androidcontentIntent; import androidosBundle; import androidwidgetTextView; public class Other extends Activity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub superonCreate(savedInstanceState); setContentView(Rlayoutother); initComponent(); Intent intent = getIntent(); int age = intentgetIntExtra("age", 0); String name = intentgetStringExtra("name"); String address = intentgetStringExtra("address"); textViewsetText("My age is " + age + "\n" + "My name is " + name + "\n" + "My address " + address); } private void initComponent() { textView = (TextView) findViewById(Ridmsg); } } ——>2 在Activity之间使用静态变量传递数据在上例中使用Intent可以很方便的在不同的Activity之间传递数据,这个也是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题。需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),其中利用静态变量来传递数据程序Demo:IntentDemojava Intent intent = new Intent(); intentsetClass(IntentDemothis, Otherclass); Otherage = 22; Othername = "AHuier"; Otheraddress = "XiaMen"; startActivity(intent); Otherjava private TextView textView; public static int age; public static String name; public static String address; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub superonCreate(savedInstanceState); setContentView(Rlayoutother); initComponent(); textViewsetText("My age is " + age + "\n" + "My name is " + name + "\n" + "My address " + address); }——>3 通剪切板传递数据 在Activity之间数据传递还可以利用一些技巧,不管是Windows还是Linux *** 作系统,都会支持一种剪切板的技术,也就是一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据。1) 利用剪切板传递普通的数据,如字符串需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),通过剪切板传递数据 程序Demo:IntentDemojavaClipboardManager clipboardManager = (ClipboardManager) getSystemService(ContextCLIPBOARD_SERVICE); String name = "AHuier"; clipboardManagersetText(name); Intent intent = new Intent(IntentDemothis, Otherclass); startActivity(intent);OtherjavaClipboardManager clipboardManager = (ClipboardManager) getSystemService(ContextCLIPBOARD_SERVICE); String msgString = clipboardManagergetText()toString(); textViewsetText(msgString);——> 1) 利用剪切板传递复杂的数据,如对象需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),通过剪切板传递数据新建一个MyDatajavapackage comandroidintentdemo; import javaioSerializable; public class MyData implements Serializable { private String name; private int age; public MyData(String name, int age) { super(); thisname = name; thisage = age; } // 提供一个toString()方法 @Override public String toString() { return "MyData [name=" + name + ", age=" + age + "]"; } public String getName() { return name; } public void setName(String name) { thisname = name; } public int getAge() { return age; } public void setAge(int age) { thisage = age; } } IntentDemojava MyData myData = new MyData("AHuier", 22); //将对象转换成字符串 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); String base64String = ""; try { ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStreamwriteObject(myData); //使用Android中提供的 Base64 工具类,这个类主要是用来对对象进行压缩也解码的过程,使用默认方式 base64String = Base64encodeToString(byteArrayOutputStreamtoByteArray(), Base64DEFAULT); objectOutputStreamclose(); } catch (Exception e) { // TODO: handle exception } ClipboardManager clipboardManager = (ClipboardManager)getSystemService(ContextCLIPBOARD_SERVICE); clipboardManagersetText(base64String); Intent intent = new Intent(IntentDemothis, Otherclass); startActivity(intent); Otherjava ClipboardManager clipboardManager = (ClipboardManager) getSystemService(ContextCLIPBOARD_SERVICE); String msgString = clipboardManagergetText()toString(); //将字符串 msgString 还原为对象 byte[] base64_byte = Base64decode(msgString, Base64DEFAULT); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(base64_byte); try { ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); MyData myData = (MyData)objectInputStreamreadObject(); textViewsetText(myDatatoString()); } catch (Exception e) { // TODO: handle exception }——>4Intent中使用全局变量来传递数据需求1:从一个Activity(Main)跳转到另外一个Activity(Other),通过全局变量来传递数据Mainjavaprivate Button button; private MyApp myApp; myApp = (MyApp)getApplication(); myAppsetName("kunhuixu"); //修改之后的名称 Intent intent = new Intent(Mainthis, Otherclass); startActivity(intent);Otherjavaprivate MyApp myApp; private TextView textView; myApp = (MyApp)getApplication(); textViewsetText("--- The app name ---" + myAppgetName());MyAppjavapackage comandroidintentglobal; import androidappApplication; / 查看Android官方文档。 Application 是所有那些需要维护全局application状态的基类。你可以提供你自己的实现机制通过在在AndroidManifestxml中提供你自己的需要声明 的标记你自己的标签。 onCreate()方法是在应用程序启动的时候被回调的。 ——>

以上就是关于如何在Android开发中activity之间数据传递全部的内容,包括:如何在Android开发中activity之间数据传递、android 页面之间传递数据、singleTask模式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存