zoukankan      html  css  js  c++  java
  • 启动其他APK的Activity方法

    有两个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);

  • 相关阅读:
    memcache的最佳实践方案。
    ehcache memcache redis 三大缓存男高音
    微服务-----(网站架构演变)
    分布式job-任务调度(一)
    rocketmq(三 java操作rocket API, rocketmq 幂等性)
    rocketMQ(二 )Centos7 集群
    go基础三 数组,切片,map,list
    go语言基础二 函数 ,递归函数 ,指针
    go语言基础一:数据类型,变量和常量,类型转化
    Spring AOP 学习(一) 代理模式
  • 原文地址:https://www.cnblogs.com/lijunamneg/p/2934060.html
Copyright © 2011-2022 走看看