intent使用
admin
2023-07-28 22:20:06
0

Android中的Intent

显式intent

使用Intentintent(Contect packageContext,Class cls)构造器构建一个intent,第一个参数Context   要求提供一个启动活动的上下文,可以是当前activity,第二个参数class则是要指定要启动的目标活动,构建好intent后将intent传入Activity类提供的startActivity()方法就可以启动目标活动。

案例:(忽略activitybutton以及监听事件的创建过程)

FirstActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button)findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            Intent intent =
new Intent(FirstActivity.this,SecondActivity.class);
            startActivity(intent);
        }
    });
}

SecondActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
second_layout);
}

点击第一个activity中的button会跳转到第二个activity

 

隐式intent

隐式intent不明确指出要启动哪一个活动,而是指定一系列更抽象的actioncategory交由系统找到适合的activity去启动。

secondactivity标签下配置可以指定当前activity能够响应的actioncategory,在androidMainFest.xml中配置

<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包含了一些附加信息,更精确地指明当前活动能响应的intent中还可能带有的category。只有内容能够同时匹配上intent指定的actioncategory时这个活动才能响应该intent

修改FirstActivity中的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button) findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(View view) {
            Intent intent =
new Intent("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 void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button)findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            Intent intent =
new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(
"http://www.baidu.com"));
            startActivity(intent);
        }
    });
}

这次指定的actionIntent.ACTION_VIEW ,是android内置的动作,常量值为android.intent.action.VIEWsetData()方法用于指定当前intent正在操作的数据,此数据需要使用Uri.parse()将一个网址字符串解析成一个Uri对象。

与此对应,我们可以在标签,更准确地表示当前活动能够响应什么类型的数据。

android:scheme。用于指定数据的协议部分,如http

android:host。用于指定数据的主机名部分,如www.baidu.com

android:port。用于指定数据的端口部分。

android:path。用于指定主机名和端口之后的部分。

android:mimeType。用于指定可处理的数据类型,可使用通配符。

只有dataintent携带的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>

在我们再点击FirstActivitybut1时会弹出所有能响应此intent的程序(browserFirstApplication),选择浏览器还会像之前一样打开浏览器,选择FirstAplication会打开ThiredActivity,但并不会加载网页。所以真正项目中不要出现这种误导用户的行为。

除了http协议还可以指定其他协议,如:geo表示地理位置,tel表示拨打电话(intent.setData(Uri.parse("tel:10086")))。

 

向下一个活动传递数据:

Intent中提供了一系列putExtra()方法的重载,可以将要传递的数据暂存到Intent中,启动另一个activity后再将数据从intent中取出即可。

FirstActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button)findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            String data =
"Hello World";
            Intent intent =
new Intent(FirstActivity.this,SecondActivity.class);
            intent.putExtra(
"extra_data",data);
            startActivity(intent);
        }
    });
}

SecondActivity:

@Override
protected void onCreate(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 void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button)findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            Intent intent =
new Intent(FirstActivity.this,SecondActivity.class);
           startActivityForResult(intent,
1);
        }
    });
}

SecondActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    Button btn2 = (Button)findViewById(R.id.
button2);
    setContentView(R.layout.
second_layout);
    btn2.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            Intent intent = getIntent();
            intent.putExtra(
"data_extra","helloworld");
            setResult(
RESULT_OK,intent);
            finish();
        }
    });
}

这里创建的intent只用于传递数据,将要传递的数据保存发哦intent中后调用setResult()方法,这个方法接收两个参数,第一个参数是用于向上一个参数返回处理结果,一般使用RESULT_OKRESULT_CANCELED这两个值,第二个参数是intent,然后调用finish()销毁当前activity

由于是使用startActivityForResult()方法启动的SecondActivity,当这个activity销毁时会调用上一个活动的onActivityResult()方法,我们需要在FirstActivity中重写此方法来获取数据。

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

不增加按钮,按下BACK按钮也可以返回上一activity,只需要在SecondActivity中重写onBackPressed()方法:

@Override
public void onBackPressed() {
    Intent intent = getIntent();
    intent.putExtra(
"data_extra","helloworld");
    setResult(
RESULT_OK,intent);
    finish();
}

 


相关内容

热门资讯

第10号台风“美莎克”登陆海南 中央气象台最新消息,今年第10号台风“美莎克”的中心已于7月3日18时20分前后在海南省陵水黎族自治...
高市早苗与莫迪“称兄道妹”,高... 据凤凰卫视报道,日本首相高市早苗7月1日至3日访问印度,与印度总理莫迪举行首脑会谈。双方以“兄妹”互...
高市“盯上”印度牛粪 (文/观察者网 郭光昊)靠牛粪就能让汽车跑起来。别惊讶这不是开玩笑,而且日本高市政府又把未来赌在这上...
一级水源河流疑遭污染,村民称上... 7月3日,网友“正哥来看”视频曝光了四川省凉山彝族自治州雷波县的簸箕河疑遭污染事件,一条泥水溪流将灰...
清华教授举报蒋方舟人大硕士论文... 7月3日,“清华教授肖鹰实名举报蒋方舟人大硕士论文系统性造假”一事登上微博热搜。7月3日,肖鹰在个人...
暴露野心?波兰总统办公室主任将... 波兰一名官员的一句话,再次点燃了华沙与基辅之间复杂的历史恩怨。塔斯社7月3日报道,波兰总统办公室主任...
哈梅内伊葬礼上,他“复活”了 新华社北京7月3日电 伊朗为已故最高领袖阿里·哈梅内伊举行葬礼前夕,一度被传遇袭身亡的伊朗伊斯兰革命...
户口迁移的事项与条件 户口迁移是一个常见的情况,需要准备一些必要的材料和满足一定的条件。本文介绍了户口迁移的事项,如迁入人...
买房验房需要注意哪些事项(买房... 地面,墙壁,楼梯是否平整。首先要查看楼层地面是否平坦,同时还要对地面、墙面、楼梯的平整度进行检查。测...
办公室墙面材料选择及办公室玻璃... 本文介绍了办公室墙面使用的几种材料以及办公室玻璃的不同材质,包括涂料类、壁纸、仿清水混凝土等墙面材料...