Android组件(二)Intent


Android组件(三)Broadcast

1.Intent

Intent本意为目的、意图,是Android程序中各组件进行交互的一种方式,它不仅可以指明当前组件要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动,启动服务以及发送广播等场景。

2.显式Intent

2.1显式Intent,即指定组件形式

指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)或者直接用构造器Intent(Context,Class)。通过指定具体的组件类,通知应用启动对应的组件

2.2 显示Intent启动活动

重载构造函数Intent(Context packageContext,Class)。第一个参数Context为启动活动的上下文,第二个参数Class则是想要启动的目标活动,通过这个构造函数可以构建出Intent的意图“Context”情况下执行“Class”。为了使用这个Intent,Activity类提供了一个startActivity()方法用于启动活动,它结收构建好的Intent参数。

2.3 启动活动代码实现

Button button_fillrom = (Button)findViewById(R.id.button_fillrom);
button_fillrom.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         Intent intent = new Intent(MainActivity.this,fillrom.class);
         startActivity(intent);
     }
});

首先构建一个Intent传入MainActivity.this作为上下文,传入fillrom.class作为目标活动,通过 startActivity(intent)执行这个Intent。执行结果为点一下button,启动fillrom.class,跳转到其所在界面。

3.隐式Intent:没有指定comonent属性的Intent

隐式Intent并没有明确指定要启动的活动,而是指定了更为抽象的action,category,data等信息,然后交给系统去分析这个Intent并找出合适的活动。

<activity android:name=".MainActivity">
     <intent-filter>
         <action android:name="android.intent.action.MAIN" />
                
         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
</activity>

< intent-filter >标签用来定义该activity可以被哪些intent激活

3.1 action

Action:用来指明要实施的动作是什么,隐式intent传递过来的action,如果和< intent-filter>中个任意一条元素匹配,那么该Intent就可以激活该activity
常用Action:

Action常量字符串说明
ACTION_MAINandroid.intent.action.MAIN作为Task中第一个Activity启动
ACTION_CALLandroid.intent.action.CALL启动一个电话,并可以使用tel:phone number指定电话号码
ACTION_EDITandroid.intent.action.EDIT显示用户输入数据
ACTION.ALL_APPSandriod.intent.action.ALL_APPS列出所有应用
ACTION_DIALandroid.intent.action.DIAL显示拨号面板
ACTION_INSERTandroid.intent.action.INSERT插入数据
ACTION_DELETEandroid.intent.action.DELETE删除数据
ACTION_RUNandroid.intent.action.RUN运行数据
ACTION_SYNCandroid.intent.action.SYNC用户数据同步
ACTION_VIEW =android.intent.action.VIEW显示用户数据

用于显示用户的数据

3.2 Category

Category:一个字符串,包含了关于处理该intent的组件的种类的信息,相当于活动要被执行需要的环境。一个intent对象可以有任意个category。intent类定义了许多category常数。

Category常量字符串说明
CATEGORY_DEFAULTandroid.intent.category.DEFAULT默认的Category,按照普通的Action执行方式执行,所有intent都可以激活。
CATEGORY_TABandroid.intent.category.TAB指定Activity作为TabActivity的Tab页
CATEGORY_LAUNCHERandroid.intent.category.LAUNCHER表示该组件为
CATEGORY_INFOandroid.intent.category.INFO用于提供包信息
CATEGORY_HOMEandroid.intent.category.HOME设置该Activity随系统启动而运行
CATEGORY_PREFERENCEandroid.intent.category.PREFERENCE设置Activity是参数面板

3.3 Data

Data:具体要操作的数据,一般为Uri指定

<data 
	android:scheme="android" 
	android:host="android.intent.action.data" 
	android:path="/target"  
	android:port="8080">
</data>

android:scheme 匹配Uri中的前缀,用于指定数据的协议
android:host 匹配Uri中的主机名
android:path 匹配Uri中的路径
android:port 匹配Uri中的端口
android:mimeType 用于指定可以处理的数据类型

4.使用隐式Intent启动活动

4.1 启动自己程序内的活动

调用Intent中的addCategory()来添加一个category

Button button_fillrom = (Button)findViewById(R.id.button_1);
button_fillrom.setOnClickListener(new View.OnClickListener() {
@Override
	public void onClick(View v) {
    Intent intent = new Intent(com.example.activity.ACTION_START);
    intent.addCategory("com.example.fillram20.MY_GATEGORY");
    startActivity(intent);
    }
});

在< intent-filter >中响应这个category

<activity android:name=".SecondActivity">
	<intent-filter>
		<action android:name="android.intent.action.ACTION_START" />
                
    	<category android:name="android.intent.category.DEFFAULT" />
        <category android:name="com.example.fillram20.MY_CATEGORY"/>
	</intent-filter>
</activity>

4.2 启动其他程序的活动

4.2.1 调用系统浏览器打开百度
@Override
	public void onClick(View v) {
    Intent intent = new Intent(com.example.activity.ACTION_VIEW);
    intent.setData(Uri.parse("http://www.baidu.com"));
    startActivity(intent);
    }

首先指定Intent的action是ACTION_VIEW,然后通过通过Uri.parse()方法,将一个网址字符串解析为一个Uri对象,再调用Intent的satData()方法将这个Uri对象传递出去。

4.2.2 调用系统拨号界面
@Override
	public void onClick(View v) {
    Intent intent = new Intent(com.example.activity.ACTION_DIAL);
    intent.setData(Uri.parse("tel:10086"));
    startActivity(intent);
    }

先指定Intent的action是Intent.Action_DIAL,,然后在data部分指定了协议是tel,号码为10086。

5.使用Intent传递数据

5.1 向下一个活动传递数据

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

使用显示方式启动SecondAcivity,并通过putExtra()方法传递一个字符串,putExtra()中有两个参数,第一个为键值,用于之后取值,第二个为具体数据。

public class fillramtest extends AppCompatActivity {
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity",data)
    }
}

通过getIntent()方法取到用于启动SecondAcivity的Intent,然后调用getStringExtra(),传入相应的键值,取出数据。如果传递的数值为整型数据,则使用getIntExtra()方法,若为布尔型数据,则使用getBooleanExtra()方法。

5.2 向上一个活动返回数据

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

返回上一个活动时只需要back就可以,并没有一个用于启动活动的Intent用于传递数据,所以使用startActivityForResult()方法,在活动销毁时返回一个结果给上一个活动。

public class fillramtest extends AppCompatActivity {
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
        Button button= (Button)findViewById(R.id.button_2);
        button_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return","Hello MainActivity");
                setRecult(RESULT_OK,intent)finish();
            }
        });
   
    }
}

使用了setRecult()方法向上一个活动返回数据,前一个参数用于向上一个活动返回处理结果,一般为RESULT_OK或RESULT_CANCELED,第二个参数吧带有数据的intent传递回去。由于使用startActivityForResult()方法启动SecondActivitty,在其被销毁后会调用onActivityResult(),须在MainActivity重写这个方法。

 @Override
 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
 	switch (requestCode){
 			case 1if (requestCode==RESULT_OK) {
                    String returnedData = data.getStringExtra("data_return");
                    Log.d("MainActivity", returnedData)
                }
                break;
            default:
     }
}

onActivityResult()中含有三个参数:
1)requestCode:启动时输入的请求码
2)resultCode:返回数据时输入的处理结果
3)Intent data:携带返回数据的Intent
一个活动可能会调用startActivityForResult()去启动不同的活动,每一个活动 返回数据都会回调到onActivityResult()中,所以先检查requestCode的值判断数据来源,再通过resultCode检查处理结果是否成功,最后从data中取值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rpk712

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值