【问题标题】:Custom intent targeting a specific package针对特定包的自定义意图
【发布时间】:2015-03-09 04:25:39
【问题描述】:

假设我的应用是“A”,我使用来自应用“A”的自定义 Intent 启动应用“B”的活动。它工作得很好,就像我想要的那样。我使用的代码在应用程序“B”的清单中:

<activity
        android:name=".mysecondAct"
        android:label="@string/title_activity_second" >
        <intent-filter>
            <action android:name="com.example.intent.action.Dream" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

在应用“A”的活动中,我启动应用“B”,

Intent i =new Intent("com.example.intent.action.Dream");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

现在,我如何指定应将意图发送到的特定包,以便只有该应用程序接收意图并启动活动?原因是,我有一个包列表,用户可以选择调用哪个包。

【问题讨论】:

    标签: android android-intent android-manifest


    【解决方案1】:

    使用 ComponentName 类,如下所示:

    Intent intent = new Intent();
    
    intent.setComponent(new ComponentName("com.example1", "com.example1.MyExampleActivity1"));
    
    startActivity(intent);
    

    请注意,第一个参数不是类的包名;它是应用程序的包名——该应用程序的 AndroidManifest.xml 中清单元素的包属性。

    如果您知道要启动的活动的名称(而不是班级),那么您可以执行以下操作:

    Class<?> claz = null;
    
    if(StringClassname != null) {
    
        try {
    
            claz = Class.forName(StringClassname );
    
        } catch (ClassNotFoundException e) {
    
            e.printStackTrace();
        }
    
    }
    
    Intent intent = new Intent(this, claz);
    
    startActivity(intent);
    

    而且,如果你甚至不知道活动名称和相应的类,那么我猜它会成为使用广播的候选者,即从你的 AppA,你应该广播..并且在 AppB、AppC 中有广播接收器等带有相应的过滤器..

    编辑:鉴于您只知道包名称和意图操作名称,请尝试像这样创建您的意图:

    Intent i = new Intent();
    
    i.setAction("com.example.intent.action.Dream");
    
    i.setPackage(packageName);
    
    startActivity(i);
    

    【讨论】:

    • 谢谢。这里的问题是,我想用我的自定义意图开始活动,这里是:“com.example.intent.action.Dream”并将目标设置为特定的包。我的意思是,我知道我应该启动的应用程序包,但不知道类。所以我将意图设置为该特定包,活动接收意图并做出响应
    • 我仍然认为答案对我没有帮助,我猜你没有明白我的意思。情况是,有许多应用程序(比如 10 个)具有意图过滤器“com.example.intent.action.Dream”的活动。现在,从我的主应用“A”中,我发送了一个带有自定义意图的 startActivity(),它只针对列表中我已经知道包名称的 10 个应用中的一个
    • 谢谢。这解决了我的问题,但我通过更广泛的搜索发现了它,我也发布了它,但不知道你的编辑。所以似乎有2个完全相同的答案。如果它保持原样可以吗?
    • 好吧,我编辑的答案是“17 分钟前编辑”,而您发布的答案是“11 分钟前已回答”,所以从技术上讲...... ;)
    • 是的,按时间戳说,是你。但我没有收到有关编辑的通知。只有当你发表评论时我才会收到通知。所以,你在那里发生了什么:P 任何我都会保持原样,任何知道该怎么做的有经验的用户都应该做应该做的事情
    【解决方案2】:

    所以修复非常简单。我只是将包设置为我的意图应该传递给哪个包。代码是:

    Intent i =new Intent("com.example.intent.action.Dream");
    i.setPackage("com.package.to.start"); //The package name of the app to which intent is to be sent
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
    

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      相关资源
      最近更新 更多