• android开发之Toast的多种应用


    Toast最基本的功能就是弹出一个弱提示,这个很简单我就不说了,说说Toast一些其他的作用。

    来公司的时候,公司产品的1.0版本已经发布出去了,但是1.0是一个必须联网才能使用的产品,在2.0中想让用户离线也可以用,但是离线的话要在标题栏下面有一个提示,说明目前处于离线状态,这个本来也是本简单的事情,但是由于前期的产品是多个人开发的,导致标题栏竟然用了四五个标题,公共的Activity有5个,这样改起来工作量非常大,后来经过思考之后我决定在Application的子类中一次性解决这个问题,使用的控件就是Toast。

    正常情况下,Toast显示的最长时间就是Toast.LENGTH,这个值是3.5秒,根本不能满足要求,我希望整个App在没网状态下运行的时候都能显示出来,并且当程序退出或者转入后台运行时结束,那么我的解决方案是使用一个线程,再使用while(true)循环,在循环中根据条件决定Toast是否显示。另外Toast的布局和显示位置我也通过自定义来处理。

    好了,废话不多说,上代码:

    public class MyApplication extends Application {
    
        private BroadcastReceiver receiver;
        private Toast toast = null;
        private boolean isNotNet = false;
        private boolean isQuit = false;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            initToast();
            //acitivty调用生命周期方法时会回调这里的方法
            this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
    
                @Override
                public void onActivityStopped(Activity activity) {
                    isQuit = isApplicationBroughtToBackground(MyApplication.this);
                    toast.cancel();
                }
    
                @Override
                public void onActivityStarted(Activity activity) {
                    isQuit = isApplicationBroughtToBackground(MyApplication.this);
                    showToast();
                }
    
                @Override
                public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    
                }
    
                @Override
                public void onActivityResumed(Activity activity) {
    
                }
    
                @Override
                public void onActivityPaused(Activity activity) {
    
                }
    
                @Override
                public void onActivityDestroyed(Activity activity) {
                    isQuit = isApplicationBroughtToBackground(MyApplication.this);
                    toast.cancel();
                }
    
                @Override
                public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    
                }
            });
        }
    
        private void initToast() {
            receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    toast = Toast.makeText(MyApplication.this, "有网",
                            Toast.LENGTH_SHORT);
                    //拿到自定义的Toast布局
                    View view = LayoutInflater.from(MyApplication.this)
                            .inflate(R.layout.layout_toast, null);
                    //设置Toast的位置在顶部,x轴偏移量为0,Y轴偏移量为140
                    toast.setGravity(Gravity.TOP, 0, 140);
                    toast.setView(view);
                    ConnectivityManager connectivityManager = (ConnectivityManager) context
                            .getSystemService(Context.CONNECTIVITY_SERVICE);
                    if (connectivityManager != null) {
                        NetworkInfo networkInfo = connectivityManager
                                .getActiveNetworkInfo();
                        if (networkInfo == null) {// 断网
                            isNotNet = true;
                            showToast();
                        } else {// 有网
                            isNotNet = false;
                        }
                    }
                }
    
            };
    
            // 注册广播
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            registerReceiver(receiver, intentFilter);
    
        }
        private void showToast() {
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    try {
    //                  for (int i = 0; i < 2000; i++) {
                        while(true){
                            //没网并且程序没有退出
                            if (isNotNet && !isQuit) {
    //                          execToast(toast);
                                toast.show();
                                Thread.sleep(1000);
                            }
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
        }
    
        private void execToast(final Toast t) {
    //      Timer timer = new Timer();
    //      timer.schedule(new TimerTask() {
    //
    //          @Override
    //          public void run() {
    //              // 调主线程方法,否则可能会显示不出来。
    //              initToast(t);
    //          }
    //
    //          private void initToast(Toast t) {
    //              t.show();
    //          }
    //
    //      }, 0);
            t.show();
        }
    
        /**
         * 判断程序是否转入后台运行
         * @param context
         * @return
         */
        public boolean isApplicationBroughtToBackground(
                final Context context) {
            ActivityManager am = (ActivityManager) context
                    .getSystemService(Context.ACTIVITY_SERVICE);
            List<RunningTaskInfo> tasks = am.getRunningTasks(1);
            if (!tasks.isEmpty()) {
                ComponentName topActivity = tasks.get(0).topActivity;
                if (!topActivity.getPackageName().equals(
                        context.getPackageName())) {
                    return true;
                }
            }
            return false;
        }
    }

    关于Application的用法可以查看android开发之重写Application类,需要以下权限:

        <!-- 判断网络状态 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <!-- 判断程序是否在后台运行 -->
        <uses-permission android:name="android.permission.GET_TASKS" />

    最后再说一句,Toast也可以用来做来电显示。

    本项目下载http://pan.baidu.com/s/1qWmRlt6

    版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。

  • 相关阅读:
    Neo.Geo系统视频硬件结构模拟 v2.0
    [原创] CPS1模拟器开发日志
    在博客园发现恶意群体回复打广告的
    [原创] Neo.Geo系统视频硬件结构模拟
    在 ASP.NET 中执行 URL 重写(读书笔记)
    c#中什么情况下用(int)什么情况下用Convert.ToInt32
    ASP.NET 例程完全代码版(7)——2.0中实现自配置的成员角色管理库
    Request.UrlReferrer详解
    .NET中获取电脑名、IP及用户名方法
    ASP.NET 2.0中的跨页面提交
  • 原文地址:https://www.cnblogs.com/lenve/p/4770529.html
Copyright © 2020-2023  润新知