你真的只有两个选择。
1)您可以创建一个以Theme.Dialog为主题的活动。这将在您的窗口顶部显示一个弹出窗口。您可以将对话框创建为无模式的(可以单击)。在我的快速测试中,我无法覆盖到我的屏幕边缘,尽管修改主题可能会解决这个问题。
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button test = (Button) this.findViewById(R.id.test);
test.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((Button) v).setBackgroundColor(Color.RED);
}
});
Intent i = new Intent(this, SecondActivity.class);
startActivity(i);
}
}
SecondActivity.java
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_main);
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
window.setGravity(Gravity.BOTTOM);
}
@Override
public void onBackPressed() {
//Override to prevent back button from closing the second activity dialog
}
}
显现
....
<activity
android:name="com.example.control.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.control.SecondActivity"
android:theme="@android:style/Theme.Dialog"
android:label="@string/app_name" >
....
</activity>
....
2) 第二个选项是使用 SYSTEM_ALERT_WINDOW。我更喜欢这种方法。你是正确的,它可以是可见的并且在所有其他应用程序之上,但是,你可以控制它何时可见,何时不可见。我不会发布任何源代码,但我会给你一个总体的攻击计划。
创建服务时,使用 AIDL 绑定到它。这样,您就可以直接与服务对话,告诉它何时“隐藏”和“显示”覆盖。说到隐藏和显示,onPause 和 onResume 可以用来告诉服务隐藏和显示覆盖。最后,如果您需要在叠加层上接收点击事件,这将被证明是棘手的,因为触摸事件并不总是按照您期望的方式运行。
祝你好运。