Android实训五-组件通信1

Android实训五-组件通信1,第1张

5、组件通信 5.1    Activity

        Activity是Android系统中最重要的也是最基本的组件。每一个Activity可以通过布局文件、Java程序或者两者相结合的方式来绘制用户界面。一个应用程序通常由多个Activity组成,它们之间通过组件通信技术形成一个有机的整体,通常是松耦合关系,一个应用程序有多个页面,每个页面通常都用一个Activity来控制。

5.1.1   Activity配置

        所有的组件(每一个Activity)都必须显式的在AndroidManifest.xml文件中进行配置,在元素中的子元素中为Activity进行配置,修改该元素即可修改该Activity的配置,配置代码如下所示:



    

     
 
         
            //对应的是res/values/strings文件中的appa_name

                  
                //intent过滤器,指定接收者响应Intent需要的类型,过滤符合要求的Activity
                
                
            

        

        //每一个Activity都需要相应的配置
        
        

    

5.1.2   启动和关闭Activity

    通常,当一个应用程序启动的时候,会呈现给用户一个界面,这个界面由某个Activity来管理,这个Activity称之为MainActivity。

1).启动Activity

(1)startActivity(Intent intent):启动Activity,其中参数intent描述待启动的Activity的信息;

         ActivityA启动ActivityB的代码如下:

Intent intent=new Intent(A.this,B.class);
startActivity(intent);

        除了上述启动应用程序中自定义的Activity外,有时候我们需要启动系统级的应用程序,例如,我们希望通过界面的电话号码直接拨打电话,这时候我么需要启动手机中的电话程序,代码如下:

Intent intent=new Intent(Intent.ACTION_DIAL);    // ACTION_DIAL表示显示拨号面板
Intent.setData(Uri.parse(“tel:114”));
startActivity(intent);

(2)startActivityForResult(Intent intent,int requestCode):以指定请求码requestCode启动Activity

2).关闭Activity

(1)finish():结束当前Activity

(2)finishActivity(int requestCode):结束以startActivityForResult(Intent intent,int requestCode)方法启动的Activity

举例1:建立三个页面,可以实现页面的跳转,如下图所示:

1~创建工程,命名为ActivityDemo,默认包名。

在工程目录src/包下:删除MainActivity,再分别创建文件FistActivity.java, SecondActivity.java,ThreeActivity.java,代码分别如下:

FistActivity.java中的代码如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class FistActivity extends Activity{
	private Button btnnext1;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.fist);
		btnnext1=(Button) findViewById(R.id.btnnext1);
		btnnext1.setOnClickListener(new View.OnClickListener() {	
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent=new Intent(FistActivity.this,SecondActivity.class);
				startActivityForResult(intent, 0);
			}
		});
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

 SecondActivity.java中的代码如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends Activity {
	private Button btnnext2, btnprevious2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second);
		btnnext2 = (Button) findViewById(R.id.btnnext2);
		btnprevious2 = (Button) findViewById(R.id.btnprevious2);
		btnnext2.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(SecondActivity.this,
						ThreeActivity.class);
			    startActivityForResult(intent, 0);
			}
		});
		
		btnprevious2.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(SecondActivity.this,
						FistActivity.class);
			    startActivityForResult(intent, 0);
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

ThreeActivity.java中的代码如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class ThreeActivity extends Activity {
	private Button btnnext3, btnprevious3;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.three);
		btnprevious3 = (Button) findViewById(R.id.btnprevious3);
		btnprevious3.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(ThreeActivity.this,
						SecondActivity.class);
				startActivityForResult(intent, 0);
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

2~在工程目录res/layout目录下,新建fist.xml,second.xml,three.xml,代码分别如下:

fist.xml代码如下:



    
    

second.xml代码如下:



    

    

        

three.xml中的代码如下:



    

    

3~在工程目录res/values目录下Strings.xml中的代码如下:

 


    第一页
    第二页
    第三页
    Settings
    Hello world!

4~双击工程目录下部署文件AndroidManifest.xml文件,配置activity.java文件,特别注意这里的android:name="com.example.demo7.ActivityA" ,这里配置的是你对应的包的名字,请注意查看自己的包,做相应的修改

 

    
    
        
            
                

                
            
        
        
        
          
        
    

运行程序。

     课堂练习:在上面例子的基础上,加一个第四页,参考第二页修改第三页,然后实现页面之间的相互跳转。

5.1.3   使用Bundle在Activity之间交换数据

          当Activity相互之间进行调用的时候,往往会需要传递一些数据。Android将通信数据封装成以键值对(key-value)形式表示的Bundle对象,两个activity是通过intent通信的,只需将Bundle数据放入到Intent,通过调用Intent对象的方法就可以实现数据传递。

   Intent提供了以下四种方法来设置传递的通信数据。

  • putExtras(Bundle data):向Intent中放入需要“携带“的数据data
  • putExtra(String name, Xxx value):向Intent中按key-value对的形式存入数据,Xxx指各种数据类型。
  • putXxx(String key,Xxx data):向Bundle放入Int,Long等各种类型的数据
  • putSerializable(String key,Serializable data):向Bundle中放入一个可序列化的对象getExtras():取出Intent所“携带”的数据

相应的,Intent也提供了相应的去除传递过来的数据的方法。

  • getXxxExtra(String name):取出从Intent中key为name的数据
  • getXxx(String key):从Bundle取出Int,Long 等各种数据类型的数据
  • getSerializable(String Key,Serializable data):从Bundle取出一个可序列化的对象

例如:ActivityA启动ActivityB,并携带name数据传递给ActivityB。相对于的代码如下:

Intent intent=new Intent(ActivityA.this, ActivityB.class);
Bundle bundle=new Bundle();
bundle.putString(“name”,”Tom”);  //把name作为键,Tom作为值放进bundle中
intent.putExtras(bundle);
startActivity(intent);

ActivityB获取传递过来的数据,相对应的代码如下:

Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String name=bundle.getString(“name”);
4.1.4   调用另一个Activity并返回结果

        如果启动另一个Activity,并且希望返回结果给当前的Activity,那么可使用startActivityForResult()方法来启动Activity。

        (1)当前的Activity要重写onActivityResult(int requestCode, int resultCode, Intent intent)方法

        (2)被启动的Activity需要调用setResult()方法设置返回结果。

【例3.1】实现数据交互的Activity之间的通信,由组件A向组件B发送一个数据。

1)创建工程,命名为IntentDemo,默认包名。

2)在工程目录src/包下:删除MainActivity.java,创建文件ActivityA.java,代码如下 :

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class ActivityA extends Activity {
	private EditText txt;
	private Button btnA;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_a);
		txt = (EditText) findViewById(R.id.txt);
		btnA = (Button) findViewById(R.id.btnA);
		btnA.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent=new Intent(ActivityA.this,ActivityB.class);
				Bundle bundle=new Bundle();
				String value=txt.getText().toString();
				bundle.putString("message", value);
				intent.putExtras(bundle);
				startActivity(intent);
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

3)在工程目录src/包下,创建ActivityB.java代码如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class ActivityB extends Activity {
	private EditText txtB;
	private Button btnB;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_b);
		txtB = (EditText) findViewById(R.id.txtB);
		btnB = (Button) findViewById(R.id.btnB);
		Intent intent = this.getIntent();
		Bundle bundle = intent.getExtras();
		String mess = bundle.getString("message");
		txtB.setText(mess);
		btnB.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent=new Intent(ActivityB.this,ActivityA.class);
				startActivity(intent);
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

4)在res/layout/目录下,删除原有的activity_main.xml,新建文件:activity_a.xml,代码如下:



    

5)在res/layout/目录下,新建文件:activity_b.xml,代码如下:



    

        
    

    

6)双击res/values/目录下strings文件,修改代码如下:




    demo10
     demo10_a
     demo10_b
    Settings
    Hello world!

7) 双击工程目录下部署文件AndroidManifest.xml文件,配置activity.java文件,特别注意这里的android:name="com.example.demo1.ActivityA" ,这里配置的是你对应的包的名字,请注意查看自己的包,做相应的修改。




    

    
        
            
                

                
            
        
        
        
    

课后练习:在这个例子的基础上,建立第三个页面,由第二个页面把接收到的数据发送到页面三。

【例3.2】实现数据交互的Activity之间的通信。(由B返回数据到A)

1)创建工程,命名为ActivityIntentDemo,默认包名。

2)在工程目录src/包下:删除MainActivity.java,创建文件ActivityA.java,代码如下 :

package com.mialab.activityintentdemo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class ActivityA extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_a);
		Button btn=(Button)findViewById(R.id.btnA);
		btn.setOnClickListener(new View.OnClickListener() {			
			@Override
			public void onClick(View arg0) {
				Intent intent=new Intent(ActivityA.this,ActivityB.class);
				startActivityForResult(intent, 0);
			}
		});		
	}
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent intent)
	{
		// 当requestCode、resultCode同时为0,也就是处理特定的结果
		if (requestCode == 0 && resultCode == 0)
		{
			// 取出Intent里的Extras数据
			Bundle data = intent.getExtras();
			// 取出Bundle中的数据
			String name = data.getString("name");
			// 设置文本框的内容
			TextView txt=(TextView)findViewById(R.id.txt);
			txt.setText(name);
		}
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

3)在工程目录src/包下,创建ActivityB.java代码如下:

package com.mialab.activityintentdemo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class ActivityB extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_b);
		Button btn=(Button)findViewById(R.id.btnB);
		btn.setOnClickListener(new View.OnClickListener() {
						@Override
			public void onClick(View arg0) {
				EditText txt=(EditText)findViewById(R.id.txtNameB);
				Intent intent=getIntent();
				Bundle bundle=new Bundle();
				bundle.putString("name",txt.getText().toString());
				intent.putExtras(bundle);
				ActivityB.this.setResult(0, intent);
				ActivityB.this.finish();
			}
		});
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_b, menu);
		return true;
	}
}

4)在res/layout/目录下,删除原有的activity_main.xml,新建文件:activity_a.xml,代码如下:



    

5)在res/layout/目录下,新建文件:activity_b.xml,代码如下:



    

        
    

    

6)在res/menu/目录下,新建文件:activity_b.xml,代码如下:



    

7)双击res/values/目录下strings文件,修改代码如下:




    ActivityA
    Settings
    Hello world!
    ActivityB

8) 双击工程目录下部署文件AndroidManifest.xml文件,配置activity.java文件,特别注意这里的android:name="com.example.demo1.ActivityA" ,这里配置的是你对应的包的名字,请注意查看自己的包,做相应的修改。




    

    
        
        
            
                

                
            
        
        
        
    

  

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

原文地址: http://outofmemory.cn/langs/721144.html

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

发表评论

登录后才能评论

评论列表(0条)

保存