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

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

时间: 2024-10-03 13:40:02

android开发之Toast的多种应用的相关文章

android 开发之Toast

今天新学了几个方法,现在分享下 Toast 的用法. Toast的用法非常简单,首先介绍一下 Toast.Toast是我在写myClock的时候遇到的,发现这是个安卓系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户, 这些消息会在click一段时间后自动消失,并且不占用屏幕的空间.下面上代码: 第一:定义一个Toast的触法点,下面就实现一个button来做Toast触法点. activity_main.xml 1 <?xml version="1.0"

Android开发之Toast

第一次在博客园发布文章,就把我刚弄明白的关于Android开发中的提示设置,分享给大家. Toast是Android中经常用到的一个方法,用于简单的用户提示,经过摸索我发现了Toast的两种使用方式,先不扯别的,分享一下,还望大师指教. 第一种系统默认的方式: Toast.makeText(getApplicationContext(), "系统自带提示形式", Toast.LENGTH_SHORT).show(); 第二种自定义方式: Toast toast = new Toast(

Android开发之ListView添加多种布局效果演示

在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断,指定ListView列表中指定位置的item加载对应的布局,在 getView中返回对应的视图,之前由于不清楚getViewTypeCount()和getItemViewType()方法,使用得比较少,一直以 为需要添加多个适配器,现在看来当时的想法说明自己见识还不够,哈哈. 第一步:创建放置Li

Android开发之Toast的使用

Toast,A toast provides simple feedback about an operation in a small popup. 对于操作提供一个简单反馈信息. 官网链接:http://developer.android.com/reference/android/widget/Toast.html 常量有两个: LENGTH_LONG   显示稍微长点的时间,大概在5秒左右LENGTH_SHORT    显示稍微短点的时候,大概在3秒左右 比较简单的使用 代码: 1 To

【转】Android 开发之旅:view的几种布局方式及实践

引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!”程序来实践证明了.在继续深入Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题:View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍.View的布局显示方式有下面几种:线性布局(Linear Layout).

android开发之MediaPlayer+Service MP3播放器

http://blog.csdn.net/zzy916853616/article/details/6450753 [java] view plaincopy import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.apps.service.Player

Android开发之InstanceState详解

Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用InstanceState保存和恢复数据功能.Android实现屏幕旋转异步下载效果这样两个示例. 首先来介绍onSaveInstanceState() 和 onRestoreInstanceState() .关于这两个方法,一些朋友可能在Andr

Android开发之WebView详解

概述: 一个显示网页的视图.这个类是你可以滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础.它使用了WebKit渲染引擎来显示网页,包括向前和向后导航的方法(通过历史记录),放大和缩小,执行文本搜索等. 需要注意的是:为了让你的应用能够使用WebView访问互联网和加载网页,你必须添加Internet的权限在Android Manifest文件中: <uses-permission android:name="android.permission.INTERNE

Android开发之IPC进程间通信-AIDL介绍及实例解析

一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期