Android M提示网络变化

多媒体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();
                    }
                });
    }
}
  • 显示效果
    这里写图片描述

Demo下载

https://github.com/guchuanhang/Android6PermissionDemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值