3

我创建了一个应用程序,使用户能够设置他是否想在应用程序在后台模式下运行时接收通知。如果启用通知,则应启动活动(对话框应出现在屏幕上)。

我尝试通过以下方式启用它:

@Override
public void onProductsResponse(List<Product> products) {
    this.products = products;
    moboolo.setProducts(products);
    if(moboolo.getAutomaticNotificationsMode() != 0 && products.size() > 0){
        if(isRunningInBackground)
        {
            Intent intent = new Intent(this, ProductListActivity.class);
            intent.setAction(Intent.ACTION_MAIN);
            startActivity(intent);
        }
    }
    drawProducts(products);

}

这是主要活动的方法。执行 onPause() 时,isRunningInBackground 设置为 true。当我在主应用程序在后台运行时尝试调试它时,该行

startActivity(intent) 没有效果(活动没有出现)。

当主要活动在后台运行时(在调用 onPause() 之后),有谁知道如何调整逻辑以便从主要活动开始活动?

谢谢你。

4

3 回答 3

7

您不能强制Activity从运行后台的应用程序中出现。 文档说

如果应用程序在后台运行并且需要用户注意,应用程序应该创建一个通知,允许用户在方便时做出响应。

如果您Activity被暂停,则用户可能正在其他应用程序中执行其他操作,并且可能不希望您Activity突然出现在他们当前正在执行的操作之上。

您应该使用状态栏通知。这允许您的应用程序在状态栏中放置一个图标。然后用户可以向下滑动状态栏抽屉并单击您的通知以打开您的应用程序并显示相关的Activity. 这是绝大多数 Android 应用程序在后台运行时通知用户的方式。

于 2010-01-10T12:22:50.127 回答
4

要完成 Hemendra 的回答,您不需要任何这些标志,除了FLAG_ACTIVITY_REORDER_TO_FRONT. 您只需要从您的正常意图创建一个 PendingIntent 并调用新的 PendingIntent 的 send() 方法来调度该意图。这是我的做法:

Intent yourIntent = new Intent(this, YourActivity.class);
// You can send extra info (as a bundle/serializable) to your activity as you do 
// with a normal intent. This is not necessary of course.
yourIntent.putExtra("ExtraInfo", extraInfo); 
// The following flag is necessary, otherwise at least on some devices (verified on Samsung 
// Galaxy S3) your activity starts, but it starts in the background i.e. the user
// doesn't see the UI
yourIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, 
                                                        yourIntent, 0);
try {
    pendingIntent.send(getApplicationContext(), 0, yourIntent);
} catch (Exception e) {
    Log.e(TAG, Arrays.toString(e.getStackTrace()));
}
于 2016-03-03T10:44:21.730 回答
2
Intent i= new Intent("android.intent.category.LAUNCHER");
i.setClass(getApplicationContext(), MyActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
PendingIntent i2 = PendingIntent.getActivity(getApplicationContext(), 0, insIntent,Intent.FLAG_ACTIVITY_NEW_TASK);
try {
     i2.send(getApplicationContext(), 0, i);
} catch (Exception e) {
     e.printStackTrace();
}

在 MyActivity 的 onCreate...

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

如果主要活动在后台运行,这会将您的活动带到前台事件。

于 2013-12-12T15:32:00.993 回答