day_02 Intent的用法

  • 跳转到另一个界面(先大体形容一下,下面有具体对Intent的解释)

  在上一个程序的基础之上,右击包,新建一个Java Class,起名为SecondActivity,并且继承活动,重写onCreate方法,然后在layout下新建布局起名为second_layout,最后引进活动里,操作跟新建一个MainActivity一个样。

  

  这是布局。

  

  千万别忘了在这里注册,这里只注册这一句话就行。

    

   把上一个随记的监听事件里的Toast改成这两行,意思是跳转到下一个活动。

  

   运行:

  

  点击按钮:

  

  成功切换!

  • Intent简介:

  Intent有意图的意思,其实它的用法很简单,它可以从一个活动跳到另一个活动,实现活动之间的互动,当然也可以启动服务和发送广播。

  它可以分为两种,显示Intent和隐式Intent。这俩有啥区别呢,下面来具体讲解。  

  • 显式Intent

  显式,显式,顾名思义,就是明显的意图,也就是说,当前活动里,直接指明要跳转到哪个活动里。

  显式有三种启动方法:

  1、class跳转:(上面那个我们用的这个)参数有两个,第一个为上下文,意思是要执行的当前活动,第二个为要跳转到的活动。利用startActivity(intent);成功启动这个意图。

1   Intent intent = new Intent(MainActivity.this,SecondActivity.class);
2   startActivity(intent);

  2、包名.类名跳转:

1 Intent intent = new Intent();
2 intent.setClassName(MainActivity.this,"com.zywwgx.firsrprogram.SecondActivity");
3 startActivity(intent);

  3、ComponentName方法: 

1 Intent intent = new Intent();
2 intent.setComponent(new ComponentName(MainActivity.this,SecondActivity.class));
3 startActivity(intent);

  在这里点击按钮,就会触发监听事件,然后就会切换到第二个活动里面。

  • 隐式Intent

  隐式呢,就是比较含蓄,他不会在MainActivity里面说明要跳转的活动,它需要在配置文件里的<activity>里的<intent-filter>里指定当前活动的action和category。

  例如现在有两个活动:MainActivity和SecondActivity。

  在AndroidManifest.xml里添加如下代码:

  (1)这是注册的MainActivity:<action android:name="android.intent.action.MAIN"/>和<category android:name="android.intent.category.LAUNCHER"/>代表它为打开应用的主活动。这个暂且固定不动。

1 <activity android:name=".MainActivity">
2             <intent-filter>
3                 <action android:name="android.intent.action.MAIN"/>
4                 <category android:name="android.intent.category.LAUNCHER"/>
5             </intent-filter>
6         </activity>

  (2)把上面注册的SecondActivity改成如图所示:<action android:name="HAHAHA"/>里的HAHAHA字符串为“暗号”,对上了,那就打开这个活动。<category android:name="android.intent.category.DEFAULT"/>这个默认不改动。

  因为最上面的案例是用的显式的,所以那个里面只注册活动就行,而这里用的隐式,在住活动里面不会明确指出要跳转的活动,所以要“通过对暗号”来确定要切换到的活动。

1 <activity android:name=".SecondActivity">
2             <intent-filter>
3                 <action android:name="HAHAHA"/>
4                 <category android:name="android.intent.category.DEFAULT"/>
5 
6             </intent-filter>
7         </activity>

  在MainActivity里添加如下代码:其实它匹配的是action和category两个,因为上面我们默认了<category android:name="android.intent.category.DEFAULT"/>,所以,这里会默认匹配。

1  Intent intent = new Intent("HAHAHA");
2  startActivity(intent);

  点击按钮后,成功运行! 

  如果在插入这一句,那么,MainActivity也应该相应改动。

1 <activity android:name=".SecondActivity">
2             <intent-filter>
3                 <action android:name="HAHAHA"/>
4                 <category android:name="android.intent.category.DEFAULT"/>
5                 <category android:name="LALALA"/>
6             </intent-filter>
7         </activity>

  这样才证实了那句话,action和category需要都匹配才能匹配上这个活动。

1  Intent intent = new Intent("HAHAHA");
2  intent.addCategory("LALALA");
3  startActivity(intent);

  总结:你想实现从MainActivity跳转到SecondActivity,有两种办法,方法一:在MainActivity里的onCreate方法里添加显性Intent。方法二:在配置文件里的SecondActivity下添加action和category,自定义名字,然后再在MainActivity里添加要跳转的活动的action和category的名字,如果有匹配到的,就会跳转到能够匹配到的活动里,假如还有个ThirdActivity活动,也在配置文件里添加了action和category,并且名字跟SecondActivity的一样,那么跳转的时候会蹦出两个选项,让你选择想要跳转的活动,毕竟这两个活动都匹配到了。

  是不是有点糊涂?不急我给画图解释。(下面的图里有点小错误,cation改成action

  (1)

  

    (2)

  

  (3)这里注册表的内容先省略,后面再补充

  

  (4)

  

  (5)如果???是hhh,SecondActivity入栈,切换到SecondActivity活动。

  

  (6)如果???是lalala,ThirdActivity入栈,切换到ThirdActivity这个活动。

  

  (7)那如果SecondActivity和ThirdActivity的action的名字一样呢?那就会弹出选择框,让你选择跳到哪个活动,选择的那个将会入栈。

  • 其他隐式Intent

   不光可以跳转到当前应用的某个活动,还可以,跳转到网页,拨号界面,发短信界面等等,这里我只演示一个例子。

   Intent.ACTION_VIEW表示意图,setData(Uri.parse("http://www.google.com"));表示设置上数据,点击后可以跳转到这个网址。

1 Intent intent  = new Intent(Intent.ACTION_VIEW);
2 intent.setData(Uri.parse("http://www.google.com"));
3 startActivity(intent);

  其他例子:

  拨打电话
    
Intent it = new Intent(Intent.ACTION_DIAL); 

    intent.setData(Uri.parse("tel:xxxxxx")); 
    startActivity(it);

  ......

  其他的可以上网具体查找,由于太多,这里就不一一列举了。  

  • 数据的传递

  1、Intend传递数据
  
(1)发送方:intent.putExtra("发送方自定义的名字",数据);
  (2)接收方:getIntend().getStringExtra("发送方自定义的名字");

  实际操作:发送方因为上一个案例我们用的隐式Intent,所以这里接着用的隐式操作

  intent.putExtra("发送方自定义的名字",数据);  这里我们定义名字为Main_01,传输的数据为hello SecondActivity,数据可以是字符串,也可以是布尔类型...

  

  接收方:用getIntent接收意图,将接收的意图,用getStringExtra“对接暗号”为Main_01得到数据,这里如果是布尔类型,用getBooleanExtra(),如果是数组类型,用getCharArrayExtra(),如果是Bundle类型,用getBundleExtra()...然后用Toast打印出来。

  

  点击切换下一个界面的按钮

  

   成功接收到第一个界面的数据,并且显示出来了。

  


    2、Bundle传递数据,可以理解成把数据打包,到,bundle中,然后再通过intent传过去。
  (1)发送方:
      Bundle bundle = new Bundle();
      bundle.putString("发送方自定义的名字1",数据);
      intend.putExtra("发送方自定义的名字2",bundle);
  (2)接收方:

Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("发送方自定义的名字2");
String data = bundle.getString("发送方自定义的名字1");

实际操作:







  • 数据回传

  (1)在MainActivity里改动Intent,从startActivity变成如图,参数有两个,一个是intent,我这里传入定义的intent;第二个是requestCode,启动活动的请求码,这里我们设成1。

  

  (2)这里给看看注册的活动,这里用的是隐式Intent

  

  (3)SecondActivity修改Intent,依旧用putExtra传送数据,第一个参数是KEY,也就是MainActivity接受数据的钥匙,第二个参数是传送的数据data。

  这次用setResult进行回传,参数有两个,第一个是resultCode,返回数据时传入的处理结果,第二个是intent。

  最后要结束掉当前活动,用finish();

    

  (4)这是MainActivity里新引入的一个函数,叫onActivityResult,为了得到SecondActivity回传的数据。这里有三个参数,requestCode就是上面我们定义的1,是用于判断数据的来源;resultCode是用来检查处理是否成功的;data是用来得到传过来的数据的。

  

  对了,还有给SecondActivity的layout添加上按钮控件,这样才好点击按钮回到第一个界面。

  

  (5)运行一下:

  

  点击按钮切换到SecondActivity活动:

  

  点击按钮返回到MainActivity活动,并且回传数据 :

  

  成功显示出传过来的数据!

猜你喜欢

转载自www.cnblogs.com/ywyh2018/p/9436546.html