Android中的Intent

2021-03-06  本文已影响0人  慕尼黑凌晨四点

显示Intent

显示Intent时明确Activity的类名的启动。有3种方法:

Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent)
ComponentName componentName = new ComponentName(this,secondActicity.class );
ComponentName componentName = new ComponentName(this,"com.xx.xx.SecondActivity" );
ComponentName componentName = new ComponentName(getPackageName(),"com.xx.xx.SecondActivity" );

Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
Intent intent = new Intent();

intent.setClass(this,SecondActivity.class);
intent.setClassName(this,"com.xx.xx.SecondActivity");
intent.setClassName(getPackageName(),"com.xx.xx.SecondActivity")
    
startActivity(intent);

ComponentName构造方法

public ComponentName(@NonNull String pkg, @NonNull String cls) {
    if (pkg == null) throw new NullPointerException("package name is null");
    if (cls == null) throw new NullPointerException("class name is null");
    mPackage = pkg;
    mClass = cls;
}

public ComponentName(@NonNull Context pkg, @NonNull String cls) {
    if (cls == null) throw new NullPointerException("class name is null");
    mPackage = pkg.getPackageName();
    mClass = cls;
}

public ComponentName(@NonNull Context pkg, @NonNull Class<?> cls) {
    mPackage = pkg.getPackageName();
    mClass = cls.getName();
}

setClass/setClassName源码

public @NonNull Intent setClass(@NonNull Context packageContext, @NonNull Class<?> cls) {
    mComponent = new ComponentName(packageContext, cls);
    return this;
}

public @NonNull Intent setClassName(@NonNull Context packageContext,@NonNull String className) {
    mComponent = new ComponentName(packageContext, className);
    return this;
}

public @NonNull Intent setClassName(@NonNull String packageName, @NonNull String className) {
    mComponent = new ComponentName(packageName, className);
    return this;
}

所以setClass/setClassName内部用到的还是ComponentName。

隐式Intent

隐式Intent通过设置Action、Data、Category,让系统来筛选出合适的Activity。根据<intent-filter>来筛选。

<intent-filter>
    <action android:name="com.cy.demo" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Intent intent = new Intent("com.cy.demo");
startActivity(intent)

可以通过隐式Intent可以直接调用外部的Activity。

可能会有重复,冲突的时候会有一个弹窗供用户选择。

上一篇 下一篇

猜你喜欢

热点阅读