• 记录:移动设备软件开发(Activity的显式启动和隐式启动)


    Intent对象简述

    Android的应用程序包含三种重要组件:Activity、Service、BroadcastReceiver,应用程序采用了一致的方式来启动它们——都是依靠Intent来启动的,Intent就封装了程序想要启动的程序的意图。不仅如此Intent还可用于与被启动组件交换信息。
    下图显示了使用Intent启动不同组件的方法

    Intent的作用

    Intent是一个可以消息传递对象,可以通过它来进行组件之间的信息传递。Intent主要有以下三个作用:

    1开启一个activity

    2 开启一个service

    3 发送广播消息

    Intent开启Activtiy

    在操作activity的显式启动和隐式启动之前,我们还是需要先了解一下什么是activity的显示启动和隐式启动
    显式启动:指明要启动的Activity所在的类,指的是它已经明确指定了将要启动的组件,故称作显式启动
    隐式启动:系统根据Intent的动作和数据来决定启动那个Activity,指的是没有指定Component属性,没有明确指定要启动哪个组件,引用将会根据Intent指定的规则去启动符合条件的组件,但具体是哪个组件不确定
    优点:只要知道被启动Activity的Action和Category即可,不用知道对应的类名或者是包名。
    只要Activity有对应的action和Category都会被启动起来。然后提供给用户选择要启动哪一个。
    需要被启动的Activity,需要在自己的AndroidManifest.xml定义对应的action 和 category。

    显式启动Activity

    显式启动Activity比较简单,先创建一个Intent,指定应用程序上下文和需要启动的Activity,然后调用startActivity来启动新的Activity

    
    
    
    
    • 1
    • 2
    • 3
    //启动Activity
    Intent it = new Intent(this, SecondActivity.class);
    startActivity(it);
    
    
    • 1
    • 2
    • 3
    • 4

    通过类名类启动Activity, 一般是同一个APK里面使用

       private void startSecondActivityByClass() {
            XLog.i(TAG, "startSecondActivityByClass()");
            Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
            try {
                startActivity(intent);
            } catch (Exception e) {
                XLog.i(TAG, "start activity error!");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过包名加类名启动

               不足:被启动的应用的包名或者类名发生变化后,就会无法启动。
        private void startSecondActivityByPackageName() {
            XLog.i(TAG, "startSecondActivityByPackage()");
            Intent intent = new Intent();
            intent.setClassName(getPackageName(), getPackageName() + ".SecondActivity");
            try {
                startActivity(intent);
            } catch (Exception e) {
                XLog.i(TAG, "start activity error!");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    通过ComponentName启动
    不足:被启动的应用的包名或者类名发生变化后,就会无法启动。

      private void startSecondActivityByComponent() {
          XLog.i(TAG, "startSecondActivityByComponent()");
          Intent intent = new Intent();
          intent.setComponent(new ComponentName(getPackageName(), getPackageName() + ".SecondActivity"));
          try {
              startActivity(intent);
          } catch (Exception e) {
              XLog.i(TAG, "start activity error!");
          }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    隐式启动Activity

    打开AndroidManifest.xml查看里面的代码,在学习隐式启动Activity前需要了解里的参数。

    Activity的别名,可以修改自己Activity的名称
    android.intent.action.MAIN决定应用程序最先启动的Activity

    给Activity进行分组,可以自己添加一个组别
    一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中
    如果自己定义的某个Activity要通过隐式启动,在AndroidManifast.xml必须加上android.intent.category.DEFAULT,否则不起作用

    android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里
    (想要App隐藏图标,去掉LAUNCHER,或者使用DEFAULT即可)
    在这里插入图片描述

    如果一个应用多个Activity都设置了这个参数,则程序列表里会显示多个该应用Activity的图标

    1.通过Activity的别名隐式启动

    
        
            
            
            
    
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    //隐式启动系统Activity
    //参数1:字符串(某Activity的别名)
    Intent it = new Intent("com.example.test.ACTION_START");  
    startActivity(it);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.通过别名和自定义的种类隐式启动

    
                
        	
            
            
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    Intent it = new Intent("com.example.test.ACTION_START");  
    //添加自定义的种类
    intent.addCategory("com.example.test.MY_CATEGORY");
    startActivity(it);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.根据用户的数据类型打开相应的Activity
    Intent.ACTION_VIEW是Android系统内置的一个动作,通过URi.parse()方法解析后,再调用Intent.setData()方法讲这个Un对象传递进去

    Intent it = new Intent("Intent.ACTION_VIEW");  
    it.setData(Uri.parse("https://www.baidu.com"));
    startActivity(it);
    
    //参数1:字符串(某Activity的别名)
    //参数2:打开的路径,通过协议来具体的确定打开什么Activity
    Intent it2 = new Intent("Intent.ACTION_VIEW", Uri.parse("https://www.baidu.com")); 
    startActivity(it2);
    
    Intent it3 = new Intent("Intent.ACTION_DIAL", Uri.parse("tel:18812341234")); 
    startActivity(it3);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4.响应用户指定的数据类型

    
                
        	
            
            
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这样就可以通过Android:scheme指定了数据的协议必须的httos协议,这样此Activity就能和浏览器网页 一样,响应一个打开网页的Intent了。

  • 相关阅读:
    [MAUI] 开篇-初识MAUI
    c语言 二分查找(迭代与递归)
    自动化测试有必要学吗?一篇从功能测试进阶到自动化测试...
    解决bootstrap模态框拖动头部区域,拖出边界,拖不回来
    学习与尝试 --> 事件风暴
    OpenCV 概念、整体架构、各模块主要功能
    今年双十二值得买的数码好物推荐!双十二数码产品抢购攻略
    JavaScript 判断用户输入的文字是否为123开头
    当try_files遇上gateway是如何产生火花的
    工单提交管理H5小程序开发
  • 原文地址:https://blog.csdn.net/m0_72471315/article/details/133280754