启动其他APK的Activity方法 (转至http://www.cnblogs.com/lijunamneg/archive/2013/02/26/2934060.html)

有两个app,分别叫做App1和App2。
App1包含两个Activity,分别叫做App1_A和App1_B.其中App1_A是入口Activity.
也就是App1_A设置intent-filter,action为<action android:name="android.intent.action.MAIN" />
App2只有一个Activity,叫做App2_A。
现在在App2_A中通过startActivity启动App1_A是没问题的.但是启动App1_B的时候报了fc错误。
logcat如下:
08-03 02:23:44.119: WARN/ActivityManager(64): Permission denied: checkComponentPermission() reqUid=10030
08-03
02:23:44.119: WARN/ActivityManager(64): Permission Denial: starting
Intent { act=android.intent.action.VIEW cmp=com.hello/.activity2 } from
ProcessRecord{407c8bc8 665:com.fileExplorer/10032} (pid=665, uid=10032)
requires null

用法如下:
Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.hello","com.hello.App1_A");//这个没问题
//ComponentName componentName = new ComponentName("com.hello","com.hello.App1_B");//这个报错
intent.setComponent(componentName);
startActivity(intent);

解决方法:
(1)
通过隐式intent调用方法实现,需要在被调用的activity的manifest文件中添加
<intent-filter>
<action android:name="com.example.project.SHOW_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
在StartActivity(it)之前,设定该intent对应的action(com.example.project.SHOW_ACTIVITY)
Intent intent = new Intent();
intent.setAction(action);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);推荐使用

利用setAction方法启动Activity还有一个好处就是不需要知道包名和Activity类名,只需要知道action就可以隐式的启动activity

(2)
即使直接指定了目标activity的ComponentName,跨应用的activity调用也要至少给目标activity指定一个带action的filter。如:
<intent-filter>
<action android:name="" />
</intent-filter>
action name为空即可。
(3)给被调用的Activity增加一个带action的filter,如下:
<intent-filter>
<action android:name="com.sdmc.ottplayer.uercenter" />
</intent-filter>
然后可以通过隐式Intent来调用,而不用使用intent.setComponent方法,如下就OK了(但是经过验证,这种方法只是对APK的入口activity有用,对普通的没用,和上面的问题一样无法解决:启动其他APK的非入口activity)
Intent i = new Intent("com.sdmc.ottplayer.uercenter");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);

异常处理:
Caused by: android.util.AndroidRuntimeException:
Calling startActivity() from outside of an Activity context requires
the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。
如果使用 Activity的startActivity方法,不会有任何限制,
而如果使用Context的startActivity方法的话,就需要开启一个新 的task,遇到上面那个异常的,都是因为使用了Context的startActivity方法。
解决办法是,加一个flag。intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

Intent intent = new Intent();
intent.setClass(mContext, VideoPlayer.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);

时间: 2024-10-10 09:16:57

启动其他APK的Activity方法 (转至http://www.cnblogs.com/lijunamneg/archive/2013/02/26/2934060.html)的相关文章

默认开机启动;通过Broadcastreceiver广播监听开机启动,实现&quot;没有activity&quot;的自启服务或者自启应用程序。

一.首先介绍一下如何开机启动: 第一种:  监控RECEIVE_BOOT_COMPLETED,即开机启动事件 第二种: 监控sd卡mount事件  开机总会扫描sd卡吧? 监控sd卡事件也有类似开机启动效果,特别app安装在sd卡的情况下有些os是抓取不到RECEIVE_BOOT_COMPLETED 第三种: android:installLocation="internalOnly", 限制app的安装位置,使其能抓取到RECEIVE_BOOT_COMPLETED 我们也可以同时使用

android动态加载已安装apk中的方法

在android开发中,有很多时候是需要用到动态加载的,今天学习在android中动态加载已安装的apk中的方法. 首先,我们需要新建一个用来被加载的android工程,暂且给他取名叫做:plugproj 在plugproj中新建一个类Dynamic,在这个类中,我们新建一些方法,等会我们会分别在该工程安装和没有安装的情况下加载这些方法,Dynamic.java如下: package com.example.plugproj; import android.app.Activity; impor

分享:APK高级保护方法解析(一)

查天气.找美食.玩游戏.买电影票.网上购物--安装APP后,手机变成"百事通".不过,智能手机越来越"聪明",也越来越不安全,病毒感染.垃圾短信.隐私泄露等关乎手机用户切身利益的问题频发.保护手机安全,不仅需要用户到正规官网下载APP,更重要的是开发者要做好APK安全保护工作.                       http://write.blog.csdn.net/postedit 下面小编就分享一下APK高级保护的方法--运行时验证 运行时验证,主要是指

[Android系列—] 3. 启动另外的活动(Activity)

前言 [Android系列-] 2. Android 项目目录结构与用户界面的创建 在上一篇中,在一个活动中(activity)中显示了一个输入框和一个按钮.这一篇讲接着上一篇继续介绍如何在点击 Send 按钮时,通过添加一些代码到MainActivity中开始一个新的Activity. 添加Send 按钮的响应 添加按钮的点击事件响应,打开 fragment_main.xml 在Button 中添加 android:onClick 属性: <Button android:layout_widt

启动一个新的activity并携带数据,返回数据给上一个activity

一.在启动一个新的activity的时候可以通过Intent携带数据,通过Intent.putExtra()方法通过键值对的形势装入数据.在新启动的activity中通过           getIntent()方法获取启动activity的Intent,并通过getxxxxExtra()获取传递的数据. 二.如果希望被启动的新activity返回数据,则需要使用startActivityForResult()启动新的activity,方法携带两个参数,第二个为请求码,用于返回时判断是由哪个a

获取apk的activity和package

有很多方法获取apk的activity和package,在这里说下我觉得最简单的: cmd中切换到sdk的build-tools\android-4.4.2目录下,输入命令aapt dump badging d:\jt.apk 我的SDK在F:\devandroid下,apk名字是jt.apk,放在了D盘根目录,所以我的命令是: F:\devandroid\sdk\build-tools\android-4.4.2>aapt dump badging d:\jt.apk 查看结果:

(转)从android一个apk中启动第三方apk应用

从android一个apk中启动第三方apk应用 我们在开发中,经常遇到遇到在一个apk中要去运行另外一个apk,就像我们windows一样,搞一个快捷方式一样,那怎么实现呢? 问题的核心点在于我们要拿到第三方apk的package名称跟class名称,这两个至关重要!比如笔者做测试用的qq apk,package名称是com.tencent.pad.qq,class名称是com.tencent.pad.qq.login.QQLoginActivity.从一个apk启动到另外一个apk,当然也是

Linux一直启动不了的解决方法

Linux一直启动不了的解决方法 虚拟机里的Linux启动不起来 决定开机 按住esc键,看一下到底启动到哪一步出错 从图中可以看出是挂载文件系统的时候出错,文件系统是CIFS, 是samba,Unable to find suitable address 说明机器找不到samba服务器的地址 先用单用户模式启动,编辑/etc/fstab文件 vi  /etc/fstab 注释掉挂载samba那一行 然后重启机器,发现还是不行, 发现这次轮到挂载NFS出问题 再次注释掉NFS那一行重新启动机器

win7开启热点时“无法启动承载网络”的解决方法

一.win7下开启热点的步骤 (1)netsh wlan set hostednetwork mode=allow ssid=wuminPC key=wuminWiFi (2)netsh wlan start hostednetwork 当然,还需要把本地连接设置为共享的,具体见:http://jingyan.baidu.com/article/5d368d1e3e499b3f61c05762.html 二.遇到问题:无法启动承载网络 输入netsh wlan start hostednetwo