欢迎访问生活随笔!

生活随笔

您现在的位置是:首页 > 形式科学 > 计算机科学 > IT网络

IT网络

学习Android (2)

发布时间:2022-11-23IT网络 小博士
(续)。。。)
隐含意图
隐式转换中仍然有两个Activity,但是现在当前上下文和要跳转的类没有通过new Intent清楚地写在代码中。但是可以通过“码字”(类似于

(接上篇。。。)

隐式Intent

一种隐式转换

  还是存在两个Activity,但是现在不是在代码中通过new Intent中明显的写出当前context和要跳转的class。而是可以通过“暗语”(类似于消息?)来触发Activity的Intent。

  首先,可以在要跳转过去的AndroidManifest.xml的XML中对于activity_main_activity2(要跳转过去的Activity)加入如下代码:

<activity android:name='.MainActivity2Activity' android:label='@string/title_activity_main_activity2' > <intent-filter> <action android:name='com.example.dingshuo.textviewdemo.ACTION_START111'/> <category android:name='android.intent.category.DEFAULT'/> </intent-filter> </activity>

  主要关注的是intent-fliter标签中的内容,action中就想到于一个“消息,通知”,表示MainActivity2Activity这个Activity在收到这个“消息”的时候,就是做出相应的action(动作),写了几次,发现这个“消息”应该不是一个系统规定的,可以是任意的,比如写个“ABC”??

实现代码如下:(以下代码实在MainActivity中写的)

nBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent('com.example.dingshuo.textviewdemo.ACTION_START111'); startActivity(intent); } });

  category则是一个更精准的条件,只有当action和category中的内容同时匹配,才可以使用Intent。可以先修改一下category中的内容。(category试验发现,也是可以填写任意字符串)

  万分注意:一定要加默认的category,直接修改默认category会造成程序崩溃!!!!!

//这个是AndroidManifest.xml对于活动2的标记 <activity android:name='.MainActivity2Activity' android:label='@string/title_activity_main_activity2' > <intent-filter> <action android:name='com.example.dingshuo.textviewdemo.ACTION_START111'/> <category android:name='android.intent.category.DEFAULT'/> <category android:name='ABC'/> </intent-filter> </activity> //这个是MainActivity里的代码 nBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent('com.example.dingshuo.textviewdemo.ACTION_START111'); intent.addCategory('ABC'); startActivity(intent); } });

另一种隐式Intent

  可以简单的认为,这种Intent的消息是用来打开其他活动的(非当前app),比如调用浏览器,调用拨号器等等,我们可以这样实现:

  

不用新建Activity了(因为要调用的是浏览器之类的,已经存在了。。。而且是别人的Activity)。

在诸如Button的Click事件中添加Intent响应即可。

intentBtn2.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是一个系统的action常量。SetData用来指定通过Uri内容来指定intent的操作对象。Uri中包含协议和内容,如上看分析出协议是http,内容是baidu.com,则实际功能就是调用外部可响应Http协议的程序打开百度页面。如果将Uri内参数改为tel:10086,则就是调用拨号。。如此这般。。。

Inten传值

第一页给第二页传值

  首先铺垫一下,通过第一页上的Button开启第二页,然后第二页接收到第一页送出去的值。

//主活动上的Button点击事件 //建立显示Intent,使用putExtra函数构建要传的值,第一个参数是“键”,第二个是“值” intentBtn3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String data=' 这是主活动传递过来的值'; Intent intent=new Intent(MainActivity.this,MainActivity2Activity.class); intent.putExtra('MainIntentValue1',data); startActivity(intent); } }); //这是第二页活动代码 //在OnCreate中加入以下代码,实例化一个intent,用getIntent来获取使第二页打开的intent //用getStringExtra函数通过键值取得传递值,用TextView进行显示 Intent intent=getIntent(); String data=intent.getStringExtra('MainIntentValue1'); textView=(TextView)findViewById(R.id.intenValueText); textView.setText(data);

第二页返回第一页传值

  具体流程是这样,第一页开启第二页,第二页开启后点击按钮关闭本页,回退到第一页,此时第一页上显示出第二页回传给第一页的值。

//MainActivity代码 intentBtn4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //使用显示Intent Intent intent=new Intent(MainActivity.this,MainActivity2Activity.class); //用于接受下一步的Activity,1相当于一个请求码,用来判断回调的 startActivityForResult(intent,1); } }); //MainActivity2Activity代码 Btn2=(Button)findViewById(R.id.button3); Btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); //本Intent只为了传值,不进行实际跳转 intent.putExtra('data_return','这是回调的传值'); //注意参数2 ,这个intent一般是带有传值的,函数将这个intent的值回传出去 setResult(RESULT_OK,intent); //相当真机的back键,销毁该页面 finish(); } });

  在上两段代码写完后,还有一个重要的步骤,那就是在MainActivity中重写父类的onActivityResult方法,原因是在主活动中我们是通过startActivityForResult启动的副活动,尔当服活动销毁后,会回调onActivityResult方法,所以需要在这个函数中获取回传的值。

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // requestCode对应startActivityForResult(intent,1)的1 //第二个参数对于副活动 setResult(RESULT_OK,intent)中的RESULT_OK //第三个参数就是携带的数据的返回intent了 switch (requestCode){ case 1: if(resultCode==RESULT_OK){ String returnedData=data.getStringExtra('data_return'); returnValue.setText(returnedData); } } }

  上述方法是通过第二页的finish()来触发的。如果通过实体的back键,则无改效果。

  需要崇业onBackPress方法

//MainActivity2Activity代码 @Override public void onBackPressed() { Intent intent=new Intent(); intent.putExtra('data_return','这是通过back键返回数据'); setResult(RESULT_OK,intent); finish(); }

  到此,通过Intent进行简单的跳转、翻页、传值就结束了。。