componentname,componentname android

http://www.itjxue.com  2023-01-20 11:04  来源:未知  点击次数: 

android怎么打开另外的应用程序

我们可以通过ComponentName以及Intent的setComponent来实现:在一个应用程序里面启动另外一个已经安装的应用程序或系统程序。

下面是一个在一个应用程序里面启动另外一个已经安装的程序,如下:

[javascript]

//组件名称,第一个参数是应用程序的包名,后一个是这个应用程序的主Activity

ComponentName com = new ComponentName("com.antroid.Test", "com.antroid.Test.TestActivity");

Intent intent = new Intent();

//设置部件

intent.setComponent(com);

startActivity(intent);

//组件名称,第一个参数是应用程序的包名,后一个是这个应用程序的主Activity

ComponentName com = new ComponentName("com.antroid.Test", "com.antroid.Test.TestActivity");

Intent intent = new Intent();

//设置部件

intent.setComponent(com);

startActivity(intent);

我们也可以使用下面的代码启动系统的日历程序:

[javascript]

Intent intent=new Intent();

intent.setComponent(new ComponentName("com.android.calendar", "com.android.calendar.LaunchActivity"));

startActivity(intent);

Intent intent=new Intent();

intent.setComponent(new ComponentName("com.android.calendar", "com.android.calendar.LaunchActivity"));

startActivity(intent

如何通过android的应用程序调用另一个应用

如果你知道另外一个程序的类名就可以这样写

intent.addCategory(Intent.CATEGORY_LAUNCHER);????????????

ComponentName?cn?=?new?ComponentName(packageName,?className);????????????

intent.setComponent(cn);

startActivity(intent);

2.如果你只知道包名不知道类名,首先获取类名

private?void?openApp(String?packageName)?{

????PackageInfo?pi?=?getPackageManager().getPackageInfo(packageName,?0);

????

????Intent?resolveIntent?=?new?Intent(Intent.ACTION_MAIN,?null);

????resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);

????resolveIntent.setPackage(pi.packageName);

????

????ListResolveInfo?apps?=?pm.queryIntentActivities(resolveIntent,?0);

????

????ResolveInfo?ri?=?apps.iterator().next();

????if?(ri?!=?null?)?{

????????String?packageName?=?ri.activityInfo.packageName;

????????String?className?=?ri.activityInfo.name;

????????

????????Intent?intent?=?new?Intent(Intent.ACTION_MAIN);

????????intent.addCategory(Intent.CATEGORY_LAUNCHER);

????????

????????ComponentName?cn?=?new?ComponentName(packageName,?className);

????????

????????intent.setComponent(cn);

????????startActivity(intent);

????}

}

然后使用1中的方法调用程序

android中componentname怎么使用

ComponentName(组件名称)是用来打开其他应用程序中的Activity或服务的。

ComponentName com = new ComponentName("com.example", "com.example.Test1");

//组件名称,第一个参数是包名,也是主配置文件Manifest里设置好的包名

第二个是类名,要带上包名

Intent intent = new Intent();

//设置部件

intent.setComponent(com);

Test.this.startActivity(intent);

Intent 的七大属性

1.七大属性:

Action,Category,Data,Extra,Type,Flag, ComponentName

2.分类:

3.详细说明:

(1)Action: 代表系统要执行的动作

系统提供如下常用的Action属性:

(2)category: 指定动作Action被执行的环境

系统提供如下常用的Category属性

注:

使用ACTION_MAIN打开系统应用时,可以配合下面的Category使用

获取方法:

SetString set = intent.getCategories();

(3)data: 通常用于向Action属性提供操作的数据, 是一个Uri对象,本质上是个字符串,常用值如下:

(4)Extra: 保存需要传递的额外数据

(5)Type: 用于指定Data所指定的Uri对应的MIME类型

(6) Intent可调用addFlags()方法来为Intent添加控制标记。即设置启动模式:

可设置的属性部分如下:

注:intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK):表示通过intent开启一个activity,并将这个activity放至栈底或者清空栈后再把这个activity压进栈去。

例:

(7)componentName: 指定了ComponentName属性的Intent已经明确了它将要启动哪个组件,因此这种Intent被称为显式Intent,没有指定ComponentName属性的Intent被称为隐式Intent。隐式Intent没有明确要启动哪个组件,应用会根据Intent指定的规则去启动符合条件的组件。

也就是说,平时我们最常用的Intent页面跳转的写法就调用的是显式Intent

android 禁止后不再询问

一、动态权限被禁止且不再提示(以读写权限为例)

这种情况一般弹出Dialog提示用户前往设置界面开启权限,一般手机我们会前往 权限管理界面,且不同的生产厂商的手机具体方法不同,我们要做判断来适配。但对于有些手机的存储权限,我们会发现权限管理界面找不到打开的开关,例如:华为M2平板,它的打开存储权限在 应用管理界面 中。所以即使同一厂商的手机,我们也要筛选特殊情况前往 应用管理界面。

1. HUAWEI (华为)

权限管理界面:

Intent intentHW = new Intent("自己应用的包名");

intentHW.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ComponentName comp = new ComponentName("com.huawei.systemmanager",

"com.huawei.permissionmanager.ui.MainActivity");

intentHW.setComponent(comp);

startActivity(intentHW);

应用管理界面:

Intent intentHW = new Intent("自己应用的包名");

intentHW.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ComponentName comp = new ComponentName("com.android.settings",

"com.android.settings.Settings$ManageApplicationsActivity");

intentHW.setComponent(comp);

startActivity(intentHW);

应用管理界面选择自己应用后的应用信息界面:(推荐使用)

Intent intentHW = new Intent("自己应用的包名");

intentHW.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ComponentName comp = new ComponentName("com.android.settings",

"com.android.settings.applications.InstalledAppDetailsTop");

intentHW.setData(Uri.parse("package:" + "自己应用的包名"));

intentHW.setComponent(comp);

startActivity(intentHW);

应用管理界面选择自己应用后的应用信息界面再选择权限后的界面:(应该不能跳)

2. MEIZU (魅族)

权限管理界面:

Intent intentMZ = new Intent("com.meizu.safe.security.SHOW_APPSEC");

intentMZ.addCategory(Intent.CATEGORY_DEFAULT);

intentMZ.putExtra("packageName", BuildConfig.APPLICATION_ID);

startActivity(intentMZ);

二、手机设置界面的Activity怎么看

上面的跳转很多都是设置ComponentName,查看对应设置界面的Activity方法,将手机打开到那个设置界面,连接adb,利用 adb shell dumpsys activity activities 命令便可查看该界面全路劲,该命令不仅适用设置界面,也适用自己的app。

三、跳转设置界面的拓展

android.provider.Settings 类中定义了很多设置界面的action,利用此action便可跳到对应页面,在该类中查找 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 可以查到有90个这样的action,具体使用(示例为悬浮于其它应用之上的权限开关)

Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,

Uri.parse("package:" + "自己应用的包名"));

startActivityForResult(intent, 191115);

这些定义的90个action中并没有 应用管理界面选择自己应用中的权限后的界面 action,甚至没有很多我们想要到达的界面,有些界面可能并不给第三方app开放,有些界面也许没有找见正确的方法。

switch (Build.MANUFACTURER) {

case Constants.ROM_HUAWEI: // 华为

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.putExtra("packageName", BuildConfig.APPLICATION_ID);

comp = new ComponentName("com.huawei.systemmanager",

"com.huawei.permissionmanager.ui.MainActivity");

intent.setComponent(comp);

startActivity(intent);

break;

case Constants.ROM_MEIZU: // 魅族

intent.setAction("com.meizu.safe.security.SHOW_APPSEC");

intent.addCategory(Intent.CATEGORY_DEFAULT);

intent.putExtra("packageName", BuildConfig.APPLICATION_ID);

startActivity(intent);

break;

case Constants.ROM_XIAOMI: // 小米

intent.setAction("miui.intent.action.APP_PERM_EDITOR");

intent.setClassName("com.miui.securitycenter",

"com.miui.permcenter.permissions.PermissionsEditorActivity");

intent.putExtra("extra_pkgname", getPackageName());

startActivity(intent);

break;

case Constants.ROM_SONY: // 索尼

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.putExtra("packageName", BuildConfig.APPLICATION_ID);

comp = new ComponentName("com.sonymobile.cta",

"com.sonymobile.cta.SomcCTAMainActivity");

intent.setComponent(comp);

startActivity(intent);

break;

case Constants.ROM_OPPO: // oppo

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.putExtra("packageName", BuildConfig.APPLICATION_ID);

comp = new ComponentName("com.color.safecenter",

"com.color.safecenter.permission.PermissionManagerActivity");

intent.setComponent(comp);

startActivity(intent);

break;

case Constants.ROM_LG: // LG

intent.setAction("android.intent.action.MAIN");

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.putExtra("packageName", BuildConfig.APPLICATION_ID);

comp = new ComponentName("com.android.settings",

"com.android.settings.Settings$AccessLockSummaryActivity");

intent.setComponent(comp);

startActivity(intent);

break;

case Constants.ROM_LETV: // 乐视

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.putExtra("packageName", BuildConfig.APPLICATION_ID);

comp = new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.PermissionAndApps");

intent.setComponent(comp);

startActivity(intent);

break;

default:

// 跳转权限设置界面

intent.setAction(Settings.ACTION_SETTINGS);

startActivity(intent);

break;

}

(责任编辑:IT教学网)

更多

推荐微软认证文章