多媒体app中,在线浏览需要大量流量,如果用户开着wifi浏览,忽然wifi断了,不能及时提示用户的话,会让用户非常气愤。在Android M(android6.0)之前,我们可以向如下所示,定义一个Dialog
public static Dialog getIKnowDialog(final Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("现在没有处于WiFi联网状态")
.setCancelable(false)
.setNegativeButton("知道了",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.setCancelable(false);
alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
return alert;
}
在manifest中注册权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
在网络变化的时候,进行弹出,提示用户。
Android M 系统弹窗
在Android M,permission分为普通权限/危险权限,特殊权限。而弹出系统窗口属于特殊权限。没有找到如何在Application中申请该权限,这里讲述一个折中的处理方法。
使用一个定义的Activity,对用户进行提示。
使用定制的Activity向用户提示网络变化
- 定义Activity样式,实现Dialog显示效果
这是一个透明的activity样式
<style name="Theme.Transparent" parent="android:Theme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
参考地址:
http://stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android
- 定义Activity的启动样式等
<activity
android:name=".SettingNetActivity"
android:excludeFromRecents="true"
android:launchMode="singleInstance"
android:taskAffinity=""
android:theme="@style/Theme.Transparent" />
android:launchMode=”singleInstance”指明该类在单独的task并作为task的根元素;
android:excludeFromRecents=”true”指明取消该类后,该task不会在后台运行程序中显示(操作上,用户点击查看后台程序时,该app不会显示两个);
android:taskAffinity=”“指明该activity和app的其他activity不属于同一个task,这样的优势在于用户销毁提示页面后,app还在后台运行。
- 罗列我的设置网络的页面
布局文件act_set_net.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@android:color/black"
android:padding="10dp" >
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="现在没有处于WiFi联网状态"
android:textColor="@android:color/white" />
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:contentDescription="@null"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_sure"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@id/tv_info"
android:layout_below="@id/tv_info"
android:layout_marginTop="10dp"
android:padding="4dp"
android:text="知道了"
android:textColor="@android:color/white" />
</RelativeLayout>
</RelativeLayout>
主代码
package com.example.android6permissiondemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class SettingNetActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_set_net);
findViewById(R.id.tv_sure).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
SettingNetActivity.this.finish();
}
});
}
}
- 显示效果