簡體   English   中英

Android:如何防止活動從后台開始並進入前台

[英]Android: how to prevent activity from starting in background and comming to foreground

在我的應用程序中,我有一個系統可以在應用程序中的任何位置顯示對話框,甚至可以從輔助線程顯示對話框。當我從服務器收到一些通知時,我只是將對話框置於用戶的眼前(對話框顯示在從應用程序上下文打開的透明活動)。 我的問題是,當應用程序在后台運行並從服務器接收信號時,它將啟動包含對話框的透明活動,因此應用程序進入前台-這違反了android(and my)規則。

我創建了一個通知系統,因此狀態欄顯示了來自服務器的傳入消息。 我與通知關聯了透明活動(用於保存對話框),因此當用戶單擊通知時,將被帶到對話框。

Intent notificationIntent = new Intent(CVSApplication.getInstance(), CVSDialogActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(CVSApplication.getInstance(), 0, notificationIntent, 0);

問題是,即使用戶沒有單擊通知,該應用程序還是會出現在最前面。

有什么方法可以防止在調用startActivity時CVSDialogActivity從backgound返回? 這是啟動CVSDialogActivity的意圖:

intent = new Intent(app, CVSDialogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(USE_CUSTOM_CONTENT, false);
intent.putExtra(INSTANCE, this.hashCode());

我也嘗試了這種變體:

intent = new Intent(app, CVSDialogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
      .addFlags(Intent.FLAG_FROM_BACKGROUND);
intent.putExtra(USE_CUSTOM_CONTENT, false);
intent.putExtra(INSTANCE, this.hashCode());

,但是當調用startActivity(intent)時,該應用程序將顯示在最前面。(我想在后台顯示包含對話框的活動,並且在用戶單擊通知時將應用程序顯示在前台)。

謝謝,亞歷克斯

我找到了解決此問題的方法。 我創建了一個系統,該系統告訴我應用程序是否在后台(使用正在運行的進程),如下所示:

public boolean isInBackground(){
    ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcesses= activityManager.getRunningAppProcesses();     


    for (RunningAppProcessInfo appProcess : appProcesses) {

        PackageInfo p = null;
        try {
            p = this.getPackageManager().getPackageInfo(appProcess.pkgList[0], PackageManager.GET_PERMISSIONS);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }



        if(p != null && p.packageName.equals(getPackageName()) && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){                                
            System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!Is in background: false");
            return false;
        }
    }

    System.out.println("!!!!!!!!!!!!!!!!!!!!!Is in background: true");
    return true;
}

現在,如果我在后台,則不會啟動對話框,而只會啟動通知,並且在按下通知時,會將應用程序置於最前面,並向用戶顯示該對話框。

亞歷克斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM