首先这个是弹activity不是部分透明对话框,也不是悬浮窗,所以不要纠结权限问题,当然如果是对话框或者悬浮框不是这么容易和简单的,需要权限不说,也不一定能适配所有的手机
只看例子,在MainActivity启动TestActivity,中间10秒你回到桌面或者进入任何其它app或者锁屏都是可以唤醒进入想要的页面,例如微信的手机登录电脑页面
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Handler().postDelayed(new Runnable() {
public void run() {
Intent in = new Intent(MainActivity.this, TestActivity.class);
startActivity(in);
}
}, 10000);
}
}
对应的布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="#ffffff">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:layout_width="100dp"
android:layout_height="50dp"
android:background="#000000"/>
</android.support.constraint.ConstraintLayout>
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
setContentView(R.layout.activity_test);
}
}
注意这里的FLAG_SHOW_WHEN_LOCKED
和FLAG_TURN_SCREEN_ON
,从名字上就能看出其作用。FLAG_TURN_SCREEN_ON
使Activity启动的时候能够点亮屏幕。FLAG_SHOW_WHEN_LOCKED
能够在屏幕锁定的时候,也能显示,如果只是想在桌面或者其它app页面弹activity的话,那么去掉这个就可以了
对应的布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TestActivity"
android:background="#ff0505">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TEST Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
对应的主题,我试过不用这个主题也是可以的
<style name="FullScreenTheme" parent="android:Theme.Light">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
<style name="noTitle_Translucent_Theme" parent="android:Theme.Light">
<item name="android:windowNoTitle">true</item>
</style>
经过上面案列测试说明,当前自己的应用置于后台的话,可以在任何界面如桌面或者任意app类,或者锁屏状态都可以切换到想要显示的activity的,注意是activity全屏页面,如果是部分对话框页面或者悬浮框的话,是不可能这么容易的,就算是activity模式的diallog对话框也如果这样搞的话,就是对话框在上面,同时也能看到对话框下面的应用的页面了,就是你自己的应用,这种启动就是将你的自己的应用切换调换到最上端,如果只是想要显示一个对话框页面的话,那是不可能的
在其他应用显示的activity模式dialog的页面如下:其实就是唤醒你自己的应用而已
上图测试案例
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
setContentView(R.layout.activity_message_dialog);
}
}
布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#b2000000">
<LinearLayout
android:layout_width="324dp"
android:layout_height="363dp"
android:orientation="vertical"
android:layout_centerInParent="true"
android:background="#ffffff">
<ImageView
android:layout_width="match_parent"
android:layout_height="114dp"
android:scaleType="fitXY"
android:src="#ed5002"/>
<TextView
android:id="@+id/titleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textColor="#000000"
android:textSize="16sp"
android:gravity="center_horizontal"
android:singleLine="true"
android:ellipsize="end"/>
<TextView
android:id="@+id/messageView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="20dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:textColor="#3f3f3f"
android:textSize="12sp"
android:scrollbars="vertical"
android:lineSpacingExtra="9dp"/>
<TextView
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="11dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:text="我知道了"
android:textColor="#00e4ff"
android:textSize="16sp"
android:background="#000000"/>
</LinearLayout>
</RelativeLayout>
清单文件
<activity
android:name=".TestActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/public_notice_dialog_style" />
主题:
<!-- 公告弹窗 -->
<style name="public_notice_dialog_style">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@drawable/public_notice_dialog_bg</item>
<item name="android:windowCloseOnTouchOutside">true</item>
<item name="android:windowAnimationStyle">@style/No_Animation</item>
</style>
<style name="No_Animation">
<item name="android:activityOpenEnterAnimation">@null</item>
<item name="android:activityOpenExitAnimation">@null</item>
<item name="android:activityCloseEnterAnimation">@null</item>
<item name="android:activityCloseExitAnimation">@null</item>
<item name="android:taskOpenEnterAnimation">@null</item>
<item name="android:taskOpenExitAnimation">@null</item>
<item name="android:taskCloseEnterAnimation">@null</item>
<item name="android:taskCloseExitAnimation">@null</item>
<item name="android:taskToFrontEnterAnimation">@null</item>
<item name="android:taskToFrontExitAnimation">@null</item>
<item name="android:taskToBackEnterAnimation">@null</item>
<item name="android:taskToBackExitAnimation">@null</item>
</style>
总结:经过上述案例测试,弹activity全屏页面可以在任何桌面或者app上显示,如微信手机登录电脑端页面,实际就是重新唤醒你的应用而已,但是如果只是想显示类似悬浮框或者部分弹框的页面,下面是桌面或者别人的应用页面,那种是很有难度的,不太可能实现的,就算实现了也需要手动设置或者获取一些权限