Android学习笔记一:两个Activity通信
来源:互联网 发布:更改电脑mac地址 编辑:程序博客网 时间:2024/05/09 09:36
出处:http://blog.csdn.net/xiazdong/article/details/7664757
一、Intent与Activity应用
0.创建新的Activity步骤
在应用中创建新的Acitivity很常见;
步骤1:创建一个class继承Activity
步骤2:在Android-manifest.xml中添加<activity>元素
比如创建了一个名为SubActivity的Activity,则需要声明如下:
- <activity android:name=".SubActivity"></activity>
1.最简单的跳转到新的Activity
程序描述:MainActivity点击按钮后跳转到SubActivity,MainActivity传递一个(name,xiazdong)给SubActivity,并获得显示;
效果如下:
点击按钮后:
IntentActivity.Java
- package org.xiazdong;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class IntentActivity extends Activity {
- private Button btn1;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn1 = (Button)this.findViewById(R.id.brn1);
- btn1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.setClass(IntentActivity.this, SubActivity.class); //从IntentActivity跳转到SubActivity
- intent.putExtra("name", "xiazdong"); //放入数据
- startActivity(intent); //开始跳转
- }
- });
- }
- }
SubActivity.java
- package org.xiazdong;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.widget.TextView;
- public class SubActivity extends Activity{
- private TextView tv1;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.sub);
- tv1 = (TextView)this.findViewById(R.id.tv1);
- Intent intent = this.getIntent(); //获得当前的Intent
- Bundle bundle = intent.getExtras(); //获得全部数据
- String value = bundle.getString("name"); //获得名为name的值
- tv1.setText(value);
- }
- }
2.带返回值的跳转
跳转到新的Activity并在结束后将返回值传给原Activity
程序描述:MainActivity跳转到SubActivity后,SubActivity执行完后返回一个结果码给IntentActivity,执行对应的过程;
程序效果:
点击跳转后执行完第二个Activity后再跳回第一个Activity
IntentActivity.java
- package org.xiazdong;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- public class IntentActivity extends Activity {
- private Button btn1;
- private TextView tv1;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn1 = (Button)this.findViewById(R.id.brn1);
- tv1 = (TextView)this.findViewById(R.id.tv2);
- btn1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.setClass(IntentActivity.this, SubActivity.class);
- startActivityForResult(intent, 100); //requestcode=100
- }
- });
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if(requestCode==100&&resultCode==200){
- Bundle bundle = data.getExtras();
- String response = bundle.getString("response");
- tv1.setText(response);
- }
- }
- }
SubActivity.java
- package org.xiazdong;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.widget.TextView;
- public class SubActivity extends Activity{
- private TextView tv1;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.sub);
- tv1 = (TextView)this.findViewById(R.id.tv1);
- Intent intent = new Intent(); //创建一个Intent
- intent.putExtra("response", "来自2");
- setResult(200,intent); //返回码为200
- finish();
- }
- }
startActivityForResult和setResult详解
startActivityForResult与startActivity的不同之处在于:
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。
相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)
简单例子介绍:
1.跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, 0)
Intent intent=new Intent();intent.setClass(A.this, B.class);Bundle bundle=new Bundle();String str1="aaaaaa";bundle.putString("str1", str1);intent.putExtras(bundle);startActivityForResult(intent, 0);//这里采用startActivityForResult来做跳转,此处的0为一个依据,可以写其他的值,但一定要>=0
2.重写onActivityResult方法,用来接收B回传的数据。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK case RESULT_OK: Bundle b=data.getExtras(); //data为B中回传的Intent String str=b.getString("str1");//str即为回传的值 break;default: break; }}
3.在B中回传数据时采用setResult方法,并且之后要调用finish方法。
setResult(RESULT_OK, intent); //intent为A传来的带有Bundle的intent,当然也可以自己定义新的Bundlefinish();//此处一定要调用finish()方法
Android activity的setResult()在什么时候调用(重点也是难点)
如果在startActivityForResult起来的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!
如果一个activity要返回数据到启动它的那个activity,可以调用setResult()方法。那什么时候去调用setResult()方法返回数据呢?
看一下源码就明白了:
public final void setResult(int resultCode, Intent data) { synchronized (this) { mResultCode = resultCode; mResultData = data; } } public void finish() { if (mParent == null) { int resultCode; Intent resultData; synchronized (this) { resultCode = mResultCode; resultData = mResultData; } if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken); try { if (ActivityManagerNative.getDefault() .finishActivity(mToken, resultCode, resultData)) { mFinished = true; } } catch (RemoteException e) { // Empty } } else { mParent.finishFromChild(this); } }
这段代码可以看出activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的
按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish,就搞定了……把BACK事件直接自己给吞了
@Override public void onBackPressed() { Log.i(TAG, "onBackPressed"); setResult(Const.LIVE_OK); super.onBackPressed(); }
当然还可以在onCreate()就调用setResult,不过我觉得这种方法没有重写onBackPressed()方法好.
在两个Activity之间实现界面切换
1.Java
- /**
- *
- */
- package com.itest;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- /**
- * @author Robin
- */
- public class ITestP3Activity extends Activity {
- Button b1;
- View v1;
- /** Called when the activity is first created. */
- @Override
- public void onCreate( Bundle savedInstanceState )
- {
- super.onCreate( savedInstanceState );
- //缓存View1
- v1 = getLayoutInflater().inflate( R.layout.p31, null );
- //动态修改v1中内容
- b1 = (Button) v1.findViewById( R.id.button1 );
- b1.setOnClickListener( new OnClickListener() {
- @Override
- public void onClick( View v )
- {
- Intent in = new Intent();
- in.setClassName( getApplicationContext(), "com.itest.ITestP4Activity" );
- startActivity( in );
- }
- } );
- //切换到v1
- setContentView( v1 );
- }
- }
2.java
- /**
- *
- */
- package com.itest;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- /**
- * @author Robin
- */
- public class ITestP4Activity extends Activity {
- Button b1;
- View v1;
- /** Called when the activity is first created. */
- @Override
- public void onCreate( Bundle savedInstanceState )
- {
- super.onCreate( savedInstanceState );
- //缓存View1
- v1 = getLayoutInflater().inflate( R.layout.p41, null );
- //动态修改v1中内容
- b1 = (Button) v1.findViewById( R.id.button1 );
- b1.setOnClickListener( new OnClickListener() {
- @Override
- public void onClick( View v )
- {
- Intent in = new Intent();
- in.setClassName( getApplicationContext(), "com.itest.ITestP3Activity" );
- startActivity( in );
- }
- } );
- //切换到v1
- setContentView( v1 );
- }
- }
切换两个Activity使用了Intent类,其实常用这个类的会有调用拨打电话、发短信等外部程序
要注意的是每次的切换,都是新启动的Activity程序,可以通过下面的代码测试一下
- /**
- *
- */
- package com.itest;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- /**
- * @author Robin
- */
- public class ITestP3Activity extends Activity {
- Button b1;
- Button b2;
- View v1;
- TextView tv1;
- /** Called when the activity is first created. */
- @Override
- public void onCreate( Bundle savedInstanceState )
- {
- super.onCreate( savedInstanceState );
- //缓存View1
- v1 = getLayoutInflater().inflate( R.layout.p31, null );
- //动态修改v1中内容
- b1 = (Button) v1.findViewById( R.id.button1 );
- b1.setOnClickListener( new OnClickListener() {
- @Override
- public void onClick( View v )
- {
- Intent in = new Intent();
- in.setClassName( getApplicationContext(), "com.itest.ITestP4Activity" );
- startActivity( in );
- }
- } );
- tv1 = (TextView) v1.findViewById( R.id.textView1 );
- b2 = (Button) v1.findViewById( R.id.button2 );
- b2.setOnClickListener( new OnClickListener() {
- @Override
- public void onClick( View v )
- {
- tv1.setText( System.currentTimeMillis()+"" );
- // TODO Auto-generated method stub
- }
- });
- //切换到v1
- setContentView( v1 );
- }
- }
会发现在切换之前TextView上显示的数字,在切换回来之后消失了
然后按系统的返回键,会一页一页的返回上一页(可以返回到有数字的一页),从而说明每次的切换,都是新启动的Activity程序
- Android学习笔记一:两个Activity通信
- 两个Activity通信(一)
- Android学习一(Activity笔记)
- Android Activity学习笔记(一)
- Android 两个activity之间通信
- Android笔记(一):Activity绑定Service,并访问通信
- Android学习笔记(一)之Activity
- Android学习笔记(一)Activity
- android 即时通信学习笔记一
- Android学习笔记-两个Activity之间传递数据
- Android学习笔记:(二)两个activity跳转
- Android学习笔记——两个Activity之间的切换
- Android学习笔记(三)Activity之间的通信
- Android学习笔记4:Activity的通信和Menu
- Android 中两个Activity相互通信
- Android学习笔记----Activity
- android学习Activity笔记
- Android学习笔记-Activity
- 我的博客第一天
- 丑数
- Linux学习之历史命令与补全
- Java之使用json-lib进行对象与json字符串之间的转换
- linux 进程通信 IPC大全
- Android学习笔记一:两个Activity通信
- Insert Interval
- Application的生命周期
- SQLmap最新版本1.0.5.20#dev
- 内核源码IO多路复用EPOLL
- Eclipse 启动提示java虚拟机启动失败,“Failed to create the Java Virtual Machine”-------解决方法
- OC的内存管理
- struts2 的简单配置总结
- iOS 网络资源汇总之UI