componentname,componentname android
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;
}