android 多个package,AndroidManifest.xml里加入多个package

下面以一问一答的形式来解决这个问题:

一般新建一个Android项目后,AndroidManifest.xml的内容都是这样的:

package="com.myactivities"

android:versionCode="1"

android:versionName="1.0">

android:label="@string/app_name">

可以看到manifest的一个属性package="com.myactivities",以后自己新建的多个activity都必须放在com.myactivities这个包里面。问题是现在我如果另外新建一个包,在里面新建几个activity类文件,这几个activity如何在AndroidManifest.xml里注册呢?我最后想达到的目的是com.myactivities里面的activity通过intent跳转到新建的包里面的某个activity,这个怎么实现呢?

---------------------------------------------------------------------

每一个Activity、Service等应用程序组件都会对应AndroidManifest.xml文件中的一个、标签。在这些标签中有一个必选的属性:android:name,该属性需要指定一个类名,例如,net.blogjava.mobile.Main类。指定android:name属性值有如下3种方式:

1.  指定完全的类名(packagename+classname),例如,net.blogjava.mobile.Main。

2.  只指定类名,例如,.Main,其中Main前面的“.”是可选的。该类所在的包名需要在标签的package属性中指定。

3.  指定相对类名,这种方式类似于第2种方式,只是在标签的android:name属性中不光指定类名,还有部分包名。例如,如果Main类在net.blogjava.mobile.abcd包中,就可以在标签的package属性中指定net.blogjava.mobile,然后在标签的android:name属性中指定.abcd.Main。

由此可见,package的目的是为了更方便地指定android:name以及其他相关属性的值,就是一个默认的包。如果不在android:name中指定包名,会自动将package属性值加在前面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要动态修改AndroidManifest.xml中service的属性,需要使用AndroidPackageManager和PackageInfo类。 首先,获取要修改的Service的PackageInfo对象: ```java PackageManager pm = getPackageManager(); PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), PackageManager.GET_SERVICES); ``` 然后,找到要修改的Service: ```java ServiceInfo[] services = packageInfo.services; ServiceInfo targetService = null; for (ServiceInfo serviceInfo : services) { if (serviceInfo.name.equals("com.example.MyService")) { targetService = serviceInfo; break; } } ``` 接下来,使用反射机制获取ServiceInfo类中的flags属性: ```java Field flagsField = ServiceInfo.class.getDeclaredField("flags"); flagsField.setAccessible(true); int flags = flagsField.getInt(targetService); ``` 修改flags属性: ```java flags |= ServiceInfo.FLAG_STOP_WITH_TASK; // 设置 FLAG_STOP_WITH_TASK 标记 ``` 最后,使用PackageParser类重新解析AndroidManifest.xml,并将修改后的ServiceInfo对象写回到AndroidManifest.xml中: ```java File packageFile = new File(getPackageResourcePath()); PackageParser packageParser = new PackageParser(); PackageParser.Package pkg = packageParser.parsePackage(packageFile, 0); pkg.applicationInfo.flags |= ApplicationInfo.FLAG_HAS_CODE; pkg.services[0] = targetService; PackageUserState state = new PackageUserState(); PackageInstaller.Session params = createSession(); PackageInstaller packageInstaller = pm.getPackageInstaller(); int sessionId = packageInstaller.createSession(params); PackageInstaller.Session session = packageInstaller.openSession(sessionId); session.fsync(new FileOutputStream(packageFile)); session.close(); ``` 注意:该方法需要在应用程序的主进程中执行,并且需要动态申请WRITE_EXTERNAL_STORAGE权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值