您的位置:首页 > 移动开发 > Android开发

Android_Activity(二)

2016-06-05 09:14 387 查看
Android_Activity_Intent

我们写Android程序的时候,一个程序肯定不止一个Activity,肯定会有很多的Activity,如何让这些Activity串联起来呢?那么就需要使用我们今天所说的Intent。

Intent一般可被用于启动活动、启动服务、以及发送广播。在Android中Intent一共分为两种,一个是隐士Intent和显示Intent

使用显示Intent

这里我创建了SecondActivity,它的布局中只是有一个Button。现在就让我们看看点击FirstActivity中的按钮如何跳转到SecondActivity中吧!

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});


隐士Intent

隐士Intent,它并不明确指定出我们想要启动哪一个活动,而是制定了一系列更为冲向的action和category等信息,然后交由系统去分析这个Intent,并帮我们找到合适的活动去启动。

1、在AndroidManifest.xml文件中在相应的Activity中添加Intent-filter属性,并在Intent-filter属性中添加action和category属性。

<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>


2、在FirstActivity中的按钮的点击事件中添加如下代码:

Button btn = (Button) findViewById(R.id.firstActivity_btnOne);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});


这里只是指定了action的值,并没有指定category的值,因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。

每一个Intent只能指定一个action,但却能指定多个category

我们可以在AndroidManifest.xml文件中的SecondActivity中添加一个category:

<category android:name="com.example.activitytest.MY_CATEGORY"/>


当我们在FirstActivity中按钮的点击事件中就可以这么写了;

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent("com.example.activitytest.ACTION_START");           intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});


更多隐士Intent的用法

使用隐士Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。

当你的应用程序中需要展示一个网页,这时你没有必要自己去实现一个浏览器,而是只需要调用系统的浏览器来打开这个网页就行了。

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(Intent.ACTION_VIEW);            intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});


Intent.ACTION_VIEW,这时一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,在调用Intent的setData()方法将这个Uri对象传递进去。

以上是通过代码指定Data的数据的,我们还可以在AndroidManifest中指定数据的。这样能够更精确的指定当前活动能够响应什么类型的数据。

data标签中主要可以配置一下内容:

android:scheme

用于指定数据的协议部分,如上例中的http部分。

android:host

用于指定数据的主机部分,如上例中的www.baidu.com

android:port

用于指定数据的端口部分,一般紧随在主机名之后。

android.path

用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。

android:mimeType

用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

我新建了一个ThirdActivity,并在AndroidManifest中这样配置这个Activity:

<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" android:host="www.baidu.com"/>
</intent-filter>
</activity>


这样不仅可以启动Android自带的浏览器,还可以启动我们自己的程序。

调用系统的拨打电话的界面

我在FirstActivity中按钮的点击事件中添加了以下几行代码:

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
});


向下一个活动传递数据

Intent不仅可以启动Activity、Service、Broadcast、而且还可以携带数据传给下一个Activity。

1、在FirstActivity中用Intent传递数据。

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data="Hello SecondActivity";
Intent intent =new             Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("data",data);
startActivity(intent);
}
});


2、在SecondActivity中接收数据。

Intent intent =getIntent();
String data= intent.getStringExtra("data");
Log.i("SecondActivity",data);


3、打印的Log日志:

06-05 10:13:53.794 26167-26167/com.example.chw.activitytest I/SecondActivity: Hello SecondActivity


返回数据给上一个活动

Activity中有一个startActivityForResult()方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。

1、在FirstActivity中的按钮的点击事件代码改写成:

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});


2、在SecondActivity中给按钮添加点击事件,当点击按钮的时候,SecondActivity将数据传给FirstActivity:

Button btn2 = (Button) findViewById(R.id.second_Btn2);
btn2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String data="Hello FirstActivity";
Intent intent =new Intent();
intent.putExtra("data",data);
setResult(RESULT_OK,intent);
//一定要记住写finish()方法
finish();
}
});


3、在FirstActivity中重写onActivityResult()方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
if (resultCode==RESULT_OK) {
String resultData=data.getStringExtra("data");
Log.i("FirstActivity",resultData);
}
break;
}
}


4、我打印的Log日志:

06-05 10:26:28.864 6101-6101/com.example.chw.activitytest I/FirstActivity: Hello FirstActivity


当我们在SecondActivity中没有点击按钮,直接按Back键返回到FirstActivity中的时候,我们也想实现将数据传递给FirstActivity,那么我们就要在SecondActivity中重写onBackPressed()方法

@Override
public void onBackPressed() {
String data="Hello FirstActivity";
Intent intent =new Intent();
intent.putExtra("data",data);
setResult(RESULT_OK,intent);
finish();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: