Android 错误:主题。半透明&;标记\u活动\u重新排序\u至\u前端

Android 错误:主题。半透明&;标记\u活动\u重新排序\u至\u前端,android,android-intent,android-activity,stack,transparency,Android,Android Intent,Android Activity,Stack,Transparency,我有一个半透明主题的活动: android:theme="@android:style/Theme.Translucent.NoTitleBar" 此外,仅此主题就可以重现问题: <style name="MyTheme" parent="@android:style/Theme"> <item name="android:windowIsTranslucent">true</item> <item name="android:wind

我有一个半透明主题的活动:

android:theme="@android:style/Theme.Translucent.NoTitleBar"
此外,仅此主题就可以重现问题:

<style name="MyTheme" parent="@android:style/Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackground">@null</item>
</style>

真的
@android:彩色/透明
@空的
此活动在启动时加载并保存在内存中(当我启动此活动时,我将
标志\u activity\u REORDER\u作为额外标记添加到\u FRONT
标志)

问题:当我启动此活动(从菜单)时,该活动没有显示,什么也没有发生。 但是:如果我删除了半透明主题:一切正常,活动将从头开始

是,调用了onNewIntent()

如果我按回去,半透明的活动就是下面的那个!但它必须是顶级的

例如

A(半透明活性)B C

堆栈:A

A星触觉(B)

堆栈:A,B

B.触觉(C)

堆栈:A、B、C

c startActivity(A)//带标志的活动重新排序到前面

堆栈应为:B、C、A

但是A从未被带到前面,尽管它的onNewIntent()被调用

有什么想法吗

旁注


有趣的未回答问题:


不希望使用
singleTask
singleInstance
android:launchMode
。这些更改了backback并将活动移动到它们自己的堆栈中。因此我们不再有A,B,C了

singleTask和singleInstance-不适用于大多数应用程序 应用程序,因为它们产生的交互模型 对用户来说是不熟悉的,这与大多数其他 应用程序


想要启动模式的可视化表示的任何人都可以尝试此应用程序:

在清单文件中活动的
标记中,
启动模式
应该是
单任务

从文件:

singleTask—如果在启动活动时已经有任务 以此活动开始运行,然后不启动新的 实例将当前任务置于最前面。现存的 实例将收到一个调用
Activity.onNewIntent()
的新实例 正在启动的意图,以及
Intent.FLAG\u ACTIVITY\u将\u带到\u前面
FLAG set。这是一个超集 单顶模式,其中如果已存在 在堆栈顶部启动的活动将收到 此处所述的意图(无需将
标志\u活动\u带到\u前方
标志集)

更新 作为更好的解决方法,您可以尝试在
onNewIntent()
onResume
中使整个窗口无效

@Override
protected void onNewIntent(Intent intent) {
   super.onNewIntent(intent);
   getWindow().getDecorView().invalidate();
}

作为解决办法而不是答案

我已经这样做了:

public class OverlayActivity extends Activity {

   @Override
   protected void onNewIntent(Intent intent) {
       super.onNewIntent(intent);
       // Restart self when attempting to be brought to front
       Intent restartIntent = new Intent(this, OverlayActivity.class);
       startActivity(restartIntent);
       finish();
   }

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_overlay);
   }
 }

如果有人能给我一个答案,他们将赢得布鲁西奖金

我刚刚删除了该标志,它对我来说一切正常,没有任何问题。第一个活动保持透明并在调用时处于顶部。试试看

这里是我整个示例的代码

第一幕

public class FirstAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("First Here Go To Second");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(FirstAct.this,SecondAct.class);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
public class SecondAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("Second Here Go To Third");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(SecondAct.this,ThirdAct.class);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
public class ThirdAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("Third Here Go To First");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(ThirdAct.this,FirstAct.class);
            //intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
SecondAct

public class FirstAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("First Here Go To Second");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(FirstAct.this,SecondAct.class);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
public class SecondAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("Second Here Go To Third");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(SecondAct.this,ThirdAct.class);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
public class ThirdAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("Third Here Go To First");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(ThirdAct.this,FirstAct.class);
            //intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
ThirdAct

public class FirstAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("First Here Go To Second");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(FirstAct.this,SecondAct.class);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
public class SecondAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("Second Here Go To Third");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(SecondAct.this,ThirdAct.class);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
public class ThirdAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Button btn = new Button(this);
       btn.setText("Third Here Go To First");
       btn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(ThirdAct.this,FirstAct.class);
            //intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
    });
       setContentView(btn);
    }
}
使用LaunchMode SingleInsance编辑活动 *显示*


如果我们不从AndroidManifest.xml的活动块中设置主题,并在第一个半透明活动的onCreate方法中的setContentView之前设置主题,那么问题就解决了,代码如下:

public class TranslucentActivityDemoActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

这是我的变通方法。我相信问题的起因是要求将后台的半透明活动带到前台。既然我们无法做到这一点,那么让我们开始创建半透明活动的新副本,而不是从头开始完全重新创建一个副本,让我们通过利用片段来减少工作量

因此,如果您的半透明活动看起来像这样(从MKJParekh的答案中复制):

我们可以将其转换为如下内容:

public class FirstAct extends FragmentActivity {
    private static SavedState mSavedState;
    private FirstFrag mFrag;

    public static class FirstFrag extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            final Context context = inflater.getContext();
            Button btn = new Button(context);
            btn.setText("First Here Go To Second");
            btn.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    Intent intent = new Intent(context, SecondAct.class);
                    startActivity(intent);
                }
            });
            return btn;
        }    
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
        mFrag = new FirstFrag();
        if (mSavedState != null) mFrag.setInitialSavedState(mSavedState);
        getSupportFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, mFrag)
            .commit();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSavedState = getSupportFragmentManager().saveFragmentInstanceState(mFrag);
        finish();
    }    
}
使用此代码,我们不需要在以后启动
FirstAct
时使用
FLAG\u ACTIVITY\u REORDER\u to\u FRONT
标志,因为它将在后台使用以前副本中的
SavedState
作为新副本的初始状态


请注意,在上面的示例代码中,我只是销毁了
FirstAct
(保存片段实例状态后调用
finish()
)的
onPause()
旧副本。一个更为严肃的实现可能会设置一个标志(在
onResume()
中检查)当在堆栈中重新访问某个特定副本时是否需要
finish()。我在AndroidManifest.xml中将uses权限标记移到应用程序标记之前。这为我解决了问题。

是的,重复了你的场景android 2.3,检查你是否得到了
的意图。在
onNewIntent()中,FLAG\u ACTIVITY\u将\u带到了前面
FLAG
onNewIntent()。。当窗口背景设置为透明时,眼睛将看不到它。。如果能看到快照就很清楚了。大约一年半前,有人在安卓开发者群上发布了一条消息。仍然没有响应
其他模式-singleTask和singleInstance-不适用于大多数应用程序,因为它们会导致用户可能不熟悉的交互模型,并且与大多数其他应用程序非常不同。
Single Instance会将其推到最前面,但是,当您接着进行下一个活动时,它将处于自己的任务中,即它自己的后台堆栈中。这不是上述问题想要的行为,也不是预期的行为。需要注意的另一点是,您尝试重新排序的活动是taskroot。。