3

我在服务中使用以下代码来打开 main/launcher Activity ,代码运行良好,直到我将该项目声明为库并创建了另外两个使用该库的项目。

所以在服务的onStartCommand中写了这段代码。

 final Notification notification = new Notification(R.drawable.ic_launcher, null, 0);   

    String notifTitle = "Service";
    String notifMessage = "Running";

    final Intent notificationIntent = new Intent(this,   MainActivity.class);
    notificationIntent.putExtra("extra", "value");
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    notificationIntent.setAction("android.intent.action.MAIN");
    notificationIntent.addCategory("android.intent.category.LAUNCHER");

    final PendingIntent contentIntent = PendingIntent
                            .getActivity(this, 0, notificationIntent,0);



    notification.setLatestEventInfo(this, notifTitle, notifMessage, contentIntent);     
    startForeground(17, notification);

MainActivity.class 是库的一部分,使用该库的两个项目有它们的主要活动 MainActivityA , MainActivityB 扩展库的 MainActivity。

现在的问题是,当我单击服务通知时,应该启动 MainActivityA 或 MainActivityB 但现在什么也没有发生,但以前当库本身是一个项目时它可以工作

任何想法都会被广泛接受,

谢谢,

4

4 回答 4

1

有几种方法可以解决这个问题。

您可以在清单中的 Activity 上声明 Intent 过滤器并广播 Intent,但如果用户在其设备上安装了这两个版本,这可能会出现问题。(支持库中有一个本地广播,您可以使用docs代替)

我个人会使用 Android 的资源系统来动态加载类名。Intents 使您能够设置 ComponentName,这与为它提供 Activity 类的硬编码引用相同。

Intent i = new Intent();
String mPackage = ctx.getPackageName();
String mClass = ctx.getResources().getString(R.string.notification_class_name);
i.setComponent(new ComponentName(mPackage,mPackage+mClass));

库项目的值可以被使用它们的项目覆盖,因此在这两个项目中,您在 strings.xml 中都有一个与该应用程序的通知活动相对应的值。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="notification_class_name">.MainActivityA</string>
</resources>

然后,您可以将此 Intent 与您的 pendingIntent 一起使用,它将打开当前应用程序内部的活动。

于 2012-11-26T04:52:01.097 回答
1

这是一个老问题,但我在尝试自己解决问题时遇到了这个问题。我想出了一种更简单的方法来做到这一点,而无需配置任何字符串或传递任何参数。

String packageName = getPackageName();
Intent notificationIntent = getPackageManager().getLaunchIntentForPackage(packageName);

现在你有了可以添加额外内容等的意图。

于 2013-07-28T02:14:51.660 回答
1

您正在硬编码您的意图

final Intent notificationIntent = new Intent(this,   MainActivity.class);

启动您的 MainActivity.class 而不是 MainActivityA.class 或 MainActivityB.class。您必须将正确的类传递给您的服务或将意图更改为更通用,并让 Intent 框架发现您的活动(这可能是您的应用程序独有的)。

我正在写一些关于意图过滤器的东西,但@smith324 打败了我。

我会考虑使用元数据而不是类似于以下的字符串资源:

<meta-data android:name="com.foo.service.LaunchName" android:value="com.foo.MainActivityA"></meta-data>

如果您添加其他库,这可以避免第三方字符串名称冲突,并且我认为可以为开发人员保持字符串文件更清洁,因为这更多地用于连接您的类,而不是可能需要为用户进行国际化/翻译的东西。

请参阅:如何将用户定义的属性/值添加到 Android 清单文件中?

于 2012-11-26T04:25:18.357 回答
0

要获取启动器活动,这是一种方法。

public static Class<?> GetLauncherActivity(Context context)
    {
        String packageName = context.getPackageName();
        Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
        String className = launchIntent.getComponent().getClassName();
        try
        {
            return Class.forName(className);
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
            return null;
        }
    }
于 2015-03-01T08:15:14.910 回答