假设有一个应用程序在AccountManager中创建一个帐户.用户Accounts and Sync
暂时浏览此应用程序的相当复杂的活动图,然后转到Android设置,删除帐户并登录(仍然Accounts and Sync
作为不同的用户.
我已经为LOGIN_ACCOUNTS_CHANGED
广播定义了一个接收器,我可以优雅地关闭所有服务.但是活动仍然存在,在其标题中带有第一个用户的名称(UI以多种方式搞砸了,但这个是最明显的).
所以,问题是:应该对这些孤儿活动做些什么?
clearTaskOnLaunch
,但是当变化发生时,所有活动都在后台.onResume()
每个活动,然后clearTask
在需要时启动活动?太乱了.android.os.Process.killProcess(android.os.Process.myPid())
用来杀死所有活动.这不是太优雅,但可以完成工作.唯一的副作用是活动堆栈仍然存在,当最合理的事情似乎是从LAUNCHER
活动开始,具有明确的历史.那么,回应描述场景的最佳方式是什么?
我一直在寻找在单个shapes.xml中定义不同形状的可能性,并在某些特定事件中引用每个形状.
最后我找到了解决问题的方法.答案是使用级别列表.
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="0">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient android:startColor="#aaa"
android:endColor="#eee" android:angle="270" />
<corners android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp" android:topLeftRadius="7dp"
android:topRightRadius="7dp" />
</shape>
</item>
<item android:maxLevel="1">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<gradient android:startColor="#eee" android:centerColor="#ddd"
android:endColor="#00fff2" android:angle="270" />
<corners android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp" android:topLeftRadius="7dp"
android:topRightRadius="7dp" />
</shape>
</item>
</level-list>
Run Code Online (Sandbox Code Playgroud)
将其应用于样式中的background属性.通过将级别设置为该元素,可以实现不同形状的交换.
例如: findViewById(R.id.mybutton).getBackground().setLevel(1);
在上面的代码中,我将第二个形状设置为id为mybutton的按钮.