美文网首页
Activity的启动方式

Activity的启动方式

作者: 王多鱼2 | 来源:发表于2019-08-17 22:07 被阅读0次

    一,Activity的启动方式?

    • 显示方式 :intent启动Activity时指定了Activity的包名和类名
     Intent intent = new Intent(MainActivity.this, FristActivity.class);
     startActivity(intent);
    
    ComponentName cn = new ComponentName("当前Act的全限定类名","启动Act的全限定类名") ;
    Intent intent = new Intent() ;
    intent.setComponent(cn) ;
    startActivity(intent) ;
    
    • 隐式方式:常用于不同应用之间的跳转(例如打开支付宝微信的支付页面)
      通过Intent-filter的Action,Category或data来实现

    1.action的匹配规则

    • action在Intent-filter可以设置多条
    • intent中必须指定action否则匹配失败且intent中action最多只有一条
    • intent中的action和intent-filter中的action必须完全一样时(包括大小写)才算匹配成功
    • intent中的action只要与intent-filter其中的一条匹配成功即可
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    
        <intent-filter>
            <action android:name="com.demo.action1"/>
            <action android:name="com.demo.action2"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    
    //方法一
    Intent intent = new Intent("com.demo.action1");
    startActivity(intent);
    //方法二
    Intent intent2 = new Intent("com.demo.action2");
    startActivity(intent2);
    

    2.category的匹配规则

    • category在intent-filter中可以有多条
    • category在intent中也可以有多条
    • intent中所有的category都可以在intent-filter中找到一样的(包括大小写)才算匹配成功
    • 通过intent启动Activity的时候如果没有添加category会自动添加android.intent.category.DEFAULT,如果intent-filter中没有添加android.intent.category.DEFAULT则会匹配失败

    3.data的匹配规则

    • intent-filter中可以设置多个data
    • intent中只能设置一个data
    • intent-filter中指定了data,intent中就要指定其中的一个data
      setType会覆盖setData,setData会覆盖setType,因此需要使用setDataAndType方法来设置data和mimeType
    scheme:主机的协议部分,如jrmf
    host:主机部分,如jrmf360.com
    port: 端口号,如8888
    path:路径,如first
    pathPrefix:指定了部分路径,它会跟Intent对象中的路径初始部分匹配,如first
    pathPattern:指定的路径可以进行正则匹配,如first
    mimeType:处理的数据类型,如image/*
    
    <data 
      android:host="string"
      android:mimeType="string"
      android:path="string"
      android:pathPattern="string"
      android:pathPrefix="string"
      android:port="string"
      android:scheme="string"/>
    

    示列代码(搬的某网友的https://www.jianshu.com/p/12c6253f1851

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    
        <intent-filter>
            <action android:name="com.jrmf360.action.ENTER"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data
                android:host="jrmf360.com"
                android:port="8888"
                android:scheme="jrmf"/>
        </intent-filter>
    </activity>
    
    <activity android:name=".FirstActivity">
    </activity>
    
    <activity android:name=".SecondActivity">
    </activity>
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            parseData();
        }
    
        private void parseData() {
            Uri data = getIntent().getData();
            if (data != null){
                String scheme = data.getScheme();
                String host = data.getHost();
                int port = data.getPort();
                String path = data.getPath();
                String query = data.getQuery();
                String message = data.getQueryParameter("message");
                Log.e(getClass().getSimpleName(),"scheme:"+scheme);
                Log.e(getClass().getSimpleName(),"host:"+host);
                Log.e(getClass().getSimpleName(),"port:"+port);
                Log.e(getClass().getSimpleName(),"path:"+path);
                Log.e(getClass().getSimpleName(),"query:"+query);
    
                if ("/first".equals(path)){
                    FirstActivity.intent(this,message);
                    finish();
                }else if ("/second".equals(path)){
                    SecondActivity.intent(this,message);
                    finish();
                }
            }
        }
    }
    
    
    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn_firstActivity){
            Intent intent = new Intent();
            intent.setAction("com.jrmf360.action.ENTER");
            intent.setData(Uri.parse("jrmf://jrmf360.com:8888/first?message=Hello FirstActivity"));
            startActivity(intent);
    
        }else if (id == R.id.btn_secondActivity){
            Intent intent = new Intent();
            intent.setAction("com.jrmf360.action.ENTER");
            intent.setData(Uri.parse("jrmf://jrmf360.com:8888/second?message=Hello SecondActivity"));
            startActivity(intent);
        }else if (id == R.id.btn_mainActivity){
            Intent intent = new Intent("com.jrmf360.action.ENTER");
            intent.setData(Uri.parse("jrmf://jrmf360.com:8888"));
            startActivity(intent);
        }
    }
    

    其它事项

    • android.intent.action.MAIN :程序最先启动的Activity可以给多个Activity设置
    • android.intent.category.LAUNCHER:应用程序是否显示在桌面,可以给多个Activity配置
    • android.intent.action.MAIN和android.intent.category.LAUNCHER同时设置会在launcher显示一个应用图标,单独设置android.intent.category.LAUNCHER不会出现图标,且一个应用程序最少要有一对。也可以设置多对,这样会在系统桌面出现过个应用程序图标。

    相关文章

      网友评论

          本文标题:Activity的启动方式

          本文链接:https://www.haomeiwen.com/subject/stocsctx.html