zoukankan      html  css  js  c++  java
  • Android开发学习之浅谈显示Intent和隐式Intent

    Intent寻找目标组件的两种方式:

    • 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。
    • 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。

    一.显式Intent

       一般情况下,一个Android应用程序中需要多个屏幕,即是多个Activity类,并且在这些Activity之间进行切换通过Intent机制来实现的。在同一个应用程序中切换Activity时,我们通常都知道要启动的Activity具体是哪一个,因此常用显式的Intent来实现的。

        下面的例子是在同一应用程序中MainActivity启动SecondActivity,下面的代码中,主要是为“转到SecondActivity”按钮添加了OnClickListener,使得按钮被点击时执行onClick()方法,onClick()方法中则利用了Intent机制,来启动SecondActivity,关键的代码是22~25行。

    main.xml

    1. <?xmlversion="1.0"encoding="utf-8"?>
    2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    3. android:orientation="vertical"
    4. android:layout_width="fill_parent"
    5. android:layout_height="fill_parent"
    6. >
    7. <TextView
    8. android:layout_width="fill_parent"
    9. android:layout_height="wrap_content"
    10. android:text="@string/hello1"
    11. />
    12. <Button
    13. android:id="@+id/btn"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:text="转到SecondActivity"
    17. />
    18. </LinearLayout>

    second.xml

    1. <?xmlversion="1.0"encoding="utf-8"?>
    2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    3. android:orientation="vertical"
    4. android:layout_width="fill_parent"
    5. android:layout_height="fill_parent"
    6. >
    7. <TextView
    8. android:layout_width="fill_parent"
    9. android:layout_height="wrap_content"
    10. android:text="@string/hello2"
    11. />
    12. <Button
    13. android:id="@+id/secondBtn"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:text="返回"
    17. />
    18. </LinearLayout>

    MainActivity.java

    1. package com.android.test.activity;
    2. import android.app.Activity;
    3. import android.content.Intent;
    4. import android.os.Bundle;
    5. import android.view.View;
    6. import android.view.View.OnClickListener;
    7. import android.widget.Button;
    8. publicclass MainActivity extends Activity {
    9. private Button btn;
    10. @Override
    11. publicvoid onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. setContentView(R.layout.main);
    14. btn = (Button)findViewById(R.id.btn);
    15. //响应按钮btn事件
    16. btn.setOnClickListener(new OnClickListener() {
    17. @Override
    18. publicvoid onClick(View v) {
    19. //显示方式声明Intent,直接启动SecondActivity
    20. Intent it = new Intent(MainActivity.this,SecondActivity.class);
    21. //启动Activity
    22. startActivity(it);
    23. }
    24. });
    25. }
    26. }

    SecondActivity.java

    1. package com.android.test.activity;
    2. import android.app.Activity;
    3. import android.content.Intent;
    4. import android.os.Bundle;
    5. import android.view.View;
    6. import android.view.View.OnClickListener;
    7. import android.widget.Button;
    8. publicclass SecondActivity extends Activity {
    9. private Button secondBtn;
    10. @Override
    11. protectedvoid onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. setContentView(R.layout.second);
    14. secondBtn=(Button)findViewById(R.id.secondBtn);
    15. //响应按钮secondBtn事件
    16. secondBtn.setOnClickListener(new OnClickListener() {
    17. @Override
    18. publicvoid onClick(View v) {
    19. //显示方式声明Intent,直接启动MainActivity
    20. Intent intent = new Intent(SecondActivity.this,MainActivity.class);
    21. //启动Activity
    22. startActivity(intent);
    23. }
    24. });
    25. }
    26. }

    AndroidManifest.xml清单文件,16~18行为SecondActivity在清单文件里的声明

    1. <?xmlversion="1.0"encoding="utf-8"?>
    2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
    3. package="com.android.test.activity"
    4. android:versionCode="1"
    5. android:versionName="1.0">
    6. <uses-sdkandroid:minSdkVersion="10"/>
    7. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
    8. <activityandroid:name=".MainActivity"
    9. android:label="@string/app_name">
    10. <intent-filter>
    11. <actionandroid:name="android.intent.action.MAIN"/>
    12. <categoryandroid:name="android.intent.category.LAUNCHER"/>
    13. </intent-filter>
    14. </activity>
    15. <activityandroid:name=".SecondActivity"
    16. android:label="@string/app_name">
    17. </activity>
    18. </application>
    19. </manifest>

    效果图:

    二.隐式Intent

       下面是同一应用程序中的Activity切换的例子,需要AndroidManifest.xml中增加Activity的声明,并设置对应的Intent Filter和Action,才能被Android的应用程序框架所匹配。

    MainActivity.java

    1. package com.android.change.activity;
    2. import android.app.Activity;
    3. import android.content.Intent;
    4. import android.os.Bundle;
    5. import android.view.View;
    6. import android.view.View.OnClickListener;
    7. import android.widget.Button;
    8. publicclass MainActivity extends Activity {
    9. private Button btn;
    10. @Override
    11. publicvoid onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. setContentView(R.layout.main);
    14. btn = (Button) findViewById(R.id.btn);
    15. // 响应按钮btn事件
    16. btn.setOnClickListener(new OnClickListener() {
    17. @Override
    18. publicvoid onClick(View v) {
    19. // 实例化Intent
    20. Intent it = new Intent();
    21. //设置Intent的Action属性
    22. it.setAction("com.android.activity.MY_ACTION");
    23. // 启动Activity
    24. startActivity(it);
    25. }
    26. });
    27. }
    28. }

    SecondActivity.java

    1. package com.android.change.activity;
    2. import android.app.Activity;
    3. import android.os.Bundle;
    4. publicclass SecondActivity extends Activity {
    5. @Override
    6. protectedvoid onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.second);
    9. }
    10. }

    main.xml

    1. <?xmlversion="1.0"encoding="utf-8"?>
    2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    3. android:orientation="vertical"
    4. android:layout_width="fill_parent"
    5. android:layout_height="fill_parent"
    6. >
    7. <TextView
    8. android:layout_width="fill_parent"
    9. android:layout_height="wrap_content"
    10. />
    11. <Button
    12. android:id="@+id/btn"
    13. android:layout_width="wrap_content"
    14. android:layout_height="wrap_content"
    15. android:text="转到SecondActivity"
    16. />
    17. </LinearLayout>

    seond.xml

    1. <?xmlversion="1.0"encoding="utf-8"?>
    2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    3. android:orientation="vertical"
    4. android:layout_width="fill_parent"
    5. android:layout_height="fill_parent"
    6. >
    7. <TextView
    8. android:layout_width="fill_parent"
    9. android:layout_height="wrap_content"
    10. android:text="@string/second"
    11. />
    12. </LinearLayout>

        AndroidManifest.xml文件的18,19行修改了Intent Filter,这样SecondActivity才能够接收到MainActivity发送的Intent。因为在MainActivity的Intent发送的动作为"com.android.activity.MY_ACTION",而在18行里,SecondActivity设置的Action也为"com.android.activity.MY_ACTION",这样就能进行匹配。

    1. <?xmlversion="1.0"encoding="utf-8"?>
    2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
    3. package="com.android.change.activity"
    4. android:versionCode="1"
    5. android:versionName="1.0">
    6. <uses-sdkandroid:minSdkVersion="10"/>
    7. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
    8. <activityandroid:name=".MainActivity"
    9. android:label="@string/app_name">
    10. <intent-filter>
    11. <actionandroid:name="android.intent.action.MAIN"/>
    12. <categoryandroid:name="android.intent.category.LAUNCHER"/>
    13. </intent-filter>
    14. </activity>
    15. <activityandroid:name=".SecondActivity">
    16. <intent-filter>
    17. <actionandroid:name = "com.android.activity.MY_ACTION"/>
    18. <categoryandroid:name = "android.intent.category.DEFAULT"/>
    19. </intent-filter>
    20. </activity>
    21. </application>
    22. </manifest>

    效果图:

     

        对于显示Intent,Android不需要再去做解析,因为目标组件很明确。Android需要解析的是隐式Intent,通过解析,将Intent映射给可以处理该Intent的Activity,Service等。Intent的解析机制主要是通过查找已经注册在AndroidManifest.xml中的所有IntentFilter以及其中定义的Intent,最终找到匹配的Intent。

  • 相关阅读:
    LightOJ1326 Race(DP)
    LightOJ1125 Divisible Group Sums(DP)
    HDU 5738 Eureka(极角排序)
    BZOJ 3223 Tyvj 1729 文艺平衡树(Splay)
    Codeforces 707D Persistent Bookcase(时间树)
    HDU 5809 Ants(KD树+并查集)
    HDU 5875 Function(ST表+二分)
    BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊(动态树)
    HDU 5737 Differencia(归并树)
    HDU 1512 Monkey King(左偏树+并查集)
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3586857.html
Copyright © 2011-2022 走看看