虽然我称之为完成,但活动得到了重建

时间:2015-07-30 10:17:32

标签: android android-activity lifecycle android-lifecycle

背景

我使用帮助程序活动来确定浮动窗口小部件(放在WindowManager中)何时打开活动,因为我需要隐藏浮动窗口小部件...

因此,我创建了一个透明活动,如果屏幕关闭,则会检查onPause。如果没有,我假设我的浮动小部件打开了一个活动。

问题

打开最近的应用程序将导致隐藏我的浮动小部件并根据需要完成帮助程序活动。

但事后再回来,重新创建我的助手活动。帮助器活动甚至显示在最近的应用程序中(虽然我完成了它)。

使用和日志

我只在一个地方打开我的活动,如下:

L.d(this, "HelperActivity will be created");
Intent i = new Intent(getContext(), HelperActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("sidebarId", mSidebar.getId());
getContext().startActivity(i);

我的日志说:

[SidebarView-241]   HelperActivity will be created
[HelperActivity-30] onCreate: 1

<<在电话上按下最近的应用按钮>

[HelperActivity-69] NEW TOP
[HelperActivity-45] onSidebarCloseEvent
[HelperActivity-36] onDestroy

<<显示最近的应用程序>>

[HelperActivity-30] onCreate: 1

代码

清单:

 <activity
        android:name=".activities.HelperActivity"
        android:configChanges="orientation|screenSize"
        android:excludeFromRecents="true"
        android:noHistory="true"
        android:theme="@style/Theme.Transparent"
        android:launchMode="singleTask" />

类别:

    public class HelperActivity extends AppCompatActivity {

    private boolean mDoCheck = true;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        BusProvider.getInstance().register(this);

        setContentView(R.layout.activity_helper);

        long sidebarId = -1;
        if (getIntent().getExtras().containsKey("sidebarId"))
            sidebarId = getIntent().getExtras().getLong("sidebarId");

        L.d(this, "onCreate: " + sidebarId);
    }

    @Override
    public void onDestroy()
    {
        L.d(this, "onDestroy");

        BusProvider.getInstance().unregister(this);
        super.onDestroy();
    }

    @Subscribe
    public void onSidebarCloseEvent(SidebarCloseEvent event)
    {
        L.d(this, "onSidebarCloseEvent");

        mDoCheck = false;
        finish();
    }

    @Override
    public void onPause()
    {
        super.onPause();

        if (!mDoCheck)
            return;

        // Pause + ScreenOn => andere Activity is on top!
        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        boolean screenOn;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH)
            screenOn = pm.isInteractive();
        else
            screenOn = pm.isScreenOn();

        if (screenOn)
        {
            L.d(this, "NEW TOP");
            BusProvider.getInstance().post(new SidebarCloseEvent(null, true, false));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

当前解决方案

我现在解决了以下问题:

在我的onCreate我使用以下内容:

boolean launchedFromHistory = (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY;
if (launchedFromHistory)
    finish();

这似乎有效......但是,也许有人对该解决方案发表评论或者知道更好的事情......