透明活动在主活动上打开。如何使其不在主活动上打开?

11
我正在开发一个应用程序,它会显示一个通知,点击通知后,我想打开一个透明的对话框式活动,其中包含与该通知相关的选项。
我定义了一个透明活动,并像这样在通知中注册它。
 Intent notificationIntent = new Intent(context, EasyToDoReminder.class);
 PendingIntent contentIntent = PendingIntent
                                .getActivity(context, 0, notificationIntent, 0);

活动已经开始,但主要活动在其后面启动。如何独立打开提醒活动?

我不是想显示对话框。我想展示一个看起来像对话框的活动。我已经使用了你提到的主题。我还有一个主要活动。当我尝试启动我的透明对话框式活动时,主要活动先启动,然后在其上方启动对话框式活动。

请问有什么更好的方法吗?


我遇到了完全相同的问题,每次调用对话框活动时,我的主活动都会在其后打开。我希望能看到一个解决方法来修复这个问题。 - Peter
9个回答

3
我可以帮您翻译成中文:

好的,我也遇到了这个问题
对于第二个活动,请使用另一个LAUNCHER活动

清单:

    <activity android:name=".popup.PopUp"
              android:label="~.Popup"
              android:theme="@style/Theme.Transparent"
              android:launchMode="singleInstance"
              android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

and in intent :

        Intent i = new Intent();
        i.setClass(service.getBaseContext(), PopUp.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                Intent.FLAG_ACTIVITY_SINGLE_TOP |
                Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        i.putExtra("id", id + "");
        context.startActivity(i);

如果您从服务中调用,请使用 service.getBaseContext(),如果不是,则仅使用您的上下文

2
以下是我的建议:

这是对我有效的方法 -

为了达到结果意图,请执行以下操作:

public void onReceive(Context context, Intent intent) {
    ... 
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    ...
}

对于封装对话框警报的活动,请按照以下方式操作(在清单文件中):

     <activity
        android:launchMode="singleInstance"
    </activity>

希望这有所帮助...

1

如果您没有启动活动,就无法启动对话框。我认为您需要执行以下操作:

  • 创建一个新的活动,将其样式更改为对话框样式:
    • android:theme="@android:style/Theme.Dialog"
  • 在这个新的活动中,添加所有您希望在用户单击通知时发生的事情。
  • 像您之前那样将通知链接到它。

现在,当您单击通知时,对话框将显示出来。


我已经创建了一个新的活动。我不想显示对话框,而是想要显示一个类似对话框的活动。我已经按照您提到的主题进行了设置。我还有一个主活动。当我尝试启动我的透明对话框活动时,主活动会先启动,然后再启动类似对话框的活动。 - Arnab
如果您关闭主活动并单击通知,那么它是否也会在对话框后面? - iTurki

1

就像booger所说的那样,在您的清单文件的<application ... </application>部分中添加android:theme="@android:style/ThemeDialog",以使您的主活动仅显示为对话框,而没有背景。

您还可以使用带有按钮的警报对话框,这些按钮可以激活您想要的选项,而不是使用第二个活动:AlertDialog reference


@Arnab "我有一个主活动和一个看起来像对话框的活动。我只是想单独启动我的对话框活动,而不启动主活动。现在清楚了吗?"主活动在做什么?为什么需要这两个活动?只是想更好地理解一下。 - Finding Nemo 2 is happening.
我的主要活动显示一个列表。对于每个项目,我可以设置提醒。我希望提醒活动能够包含一些细节,例如推迟和解除该提醒。 - Arnab
对于您的提醒按钮,您可以这样做来启动管理提醒的第二个活动:reminderbutton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { reminderfunction(); } }); private void reminderfunction { Intent remindermanager = new Intent(this, Secondactivity.class); startActivity(remindermanager); //启动第二个活动 } - Finding Nemo 2 is happening.
我正在尝试这样做...但我只想从通知中启动SecondActivity,该活动将像浮动窗口(就像对话框)一样,而不是在后台显示主要活动。 - Arnab
1
setFullScreenIntent 可能是您正在寻找的,它可以打开第二个活动而不是进入通知中心。第二个活动可以具有 android:theme="@android:style/Theme.Dialog" 属性,因此它只显示为一个没有背景的浮动窗口。理论上听起来很好,现在正在尝试编写一个可行的示例。 - Finding Nemo 2 is happening.
嗨,只是想说我遇到了同样的问题,当我启动对话框活动时,主活动就会在其后面启动。看到一个可行的答案会很棒。 - Peter

1

谢谢你的回答。但是在我完成主活动之前,我还没有开始我的活动。因为我只是在通知管理器中设置了我的第二个活动。点击后它会启动第二个活动。我没有编写像startActivity()这样的代码。你能告诉我在哪里可以写finish()吗? - Arnab
如果您明确调用startActivity(),可以使用此解决方案。在此之前,finish()主活动。 - Arnab

1

我解决了我的问题。

首先,我在清单文件中为我的第二个活动添加了以下属性。

android:launchMode="singleTask"

当从通知中启动时,我将以下标志设置为意图。

Intent notificationIntent = new Intent(context, EasyToDoReminder.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET );

它可以运行!


0

我认为在启动Activity之前,您将无法启动对话框(这是我认为您正在尝试做的事情)。

您可以将主Activity样式设置为对话框样式,但除此之外,我认为您无法启动对话框而不具备与之相关联的Activity上下文。

我可能误解了您的问题。


我有一个主活动和一个看起来像对话框的活动。我只想启动我的对话框活动,而不启动主活动。现在清楚了吗? - Arnab

0
你可以尝试使用弹出窗口,然后在该弹出窗口中填充你的布局。 或者,使用android:theme="@android:style/Theme.Dialog"来获得对话框的效果,当实际上它是一个活动。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接