Android中的Intent
创新互联建站服务项目包括阳原网站建设、阳原网站制作、阳原网页制作以及阳原网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,阳原网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到阳原省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!显式intent:
使用Intent的intent(Contect packageContext,Class> cls)构造器构建一个intent,第一个参数Context 要求提供一个启动活动的上下文,可以是当前activity,第二个参数class则是要指定要启动的目标活动,构建好intent后将intent传入Activity类提供的startActivity()方法就可以启动目标活动。
案例:(忽略activity、button以及监听事件的创建过程)
FirstActivity:
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button)findViewById(R.id.but1);
btn.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(Viewview) {
Intent intent = newIntent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
SecondActivity:
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
}
点击第一个activity中的button会跳转到第二个activity。
隐式intent:
隐式intent不明确指出要启动哪一个活动,而是指定一系列更抽象的action和category交由系统找到适合的activity去启动。
在secondactivity的
<activity
android:name=".SecondActivity"
android:label="SecondActivity">
<intent-filter>
<action android:name="com.example.zhangwd.firstapplication.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
intent-filter>
activity>
在action中指定了当前活动可以响应com.example.zhangwd.firstapplication.ACTION_START这个action,
修改FirstActivity中的代码:
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button) findViewById(R.id.but1);
btn.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
Intent intent = newIntent("com.example.zhangwd.firstapplication.ACTION_START");
//intent.addCategory("android.intent.category.DEFAULT")
//android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法时会自动将此category加上
startActivity(intent);
}
});
}
Intent启动其他程序的活动:
修改FirstActivity的代码:
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button)findViewById(R.id.but1);
btn.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(Viewview) {
Intent intent = newIntent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
}
这次指定的action是Intent.ACTION_VIEW ,是android内置的动作,常量值为android.intent.action.VIEW。setData()方法用于指定当前intent正在操作的数据,此数据需要使用Uri.parse()将一个网址字符串解析成一个Uri对象。
与此对应,我们可以在
android:scheme。用于指定数据的协议部分,如http。
android:host。用于指定数据的主机名部分,如www.baidu.com
android:port。用于指定数据的端口部分。
android:path。用于指定主机名和端口之后的部分。
android:mimeType。用于指定可处理的数据类型,可使用通配符。
只有data和intent携带的data一致时才能响应该intent,一般中不会指定过多。像浏览器的示例中只需指定scheme可以响应所有http协议的intent。
如果我们再增加一个ThirdActivity,在androidMeanFest.xml中修改注册信息:
<activity
android:name=".ThirdActivity"
android:label="ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
intent-filter>
activity>
在我们再点击FirstActivity的but1时会弹出所有能响应此intent的程序(browser、FirstApplication),选择浏览器还会像之前一样打开浏览器,选择FirstAplication会打开ThiredActivity,但并不会加载网页。所以真正项目中不要出现这种误导用户的行为。
除了http协议还可以指定其他协议,如:geo表示地理位置,tel表示拨打电话(intent.setData(Uri.parse("tel:10086")))。
向下一个活动传递数据:
Intent中提供了一系列putExtra()方法的重载,可以将要传递的数据暂存到Intent中,启动另一个activity后再将数据从intent中取出即可。
FirstActivity:
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button)findViewById(R.id.but1);
btn.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(Viewview) {
String data = "Hello World";
Intent intent = newIntent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
});
}
SecondActivity:
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
}
如果传递的是布尔类型数据可以使用getBoolenExtra();
返回数据给上一个activity:
Activity中有一个startActivityForResult()方法也用于启动活动,但这个方法期望在活动销毁时返回一个结果给上一个活动。
StartActivityForResult()接收两个参数,第一个参数还是intent第二个参数是请求码,用于在之后的回调中判断数据源的来源。
FirstActivity:
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button)findViewById(R.id.but1);
btn.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(Viewview) {
Intent intent = newIntent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
}
SecondActivity:
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn2 = (Button)findViewById(R.id.button2);
setContentView(R.layout.second_layout);
btn2.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(Viewview) {
Intent intent = getIntent();
intent.putExtra("data_extra","helloworld");
setResult(RESULT_OK,intent);
finish();
}
});
}
这里创建的intent只用于传递数据,将要传递的数据保存发哦intent中后调用setResult()方法,这个方法接收两个参数,第一个参数是用于向上一个参数返回处理结果,一般使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数是intent,然后调用finish()销毁当前activity。
由于是使用startActivityForResult()方法启动的SecondActivity,当这个activity销毁时会调用上一个活动的onActivityResult()方法,我们需要在FirstActivity中重写此方法来获取数据。
@Override
protected voidonActivityResult(intrequestCode,intresultCode, Intent data) {
switch(requestCode){
case1:
if(RESULT_OK== resultCode){
String returnData =data.getStringExtra("data_extra");
Log.d("FirstActivity", returnData);
}
break;
default:
}
}
不增加按钮,按下BACK按钮也可以返回上一activity,只需要在SecondActivity中重写onBackPressed()方法:
@Override
public voidonBackPressed() {
Intent intent = getIntent();
intent.putExtra("data_extra","helloworld");
setResult(RESULT_OK,intent);
finish();
}
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。