Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android開發之Toast的多種應用

android開發之Toast的多種應用

編輯:關於Android編程

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 tasks = am.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(
                    context.getPackageName())) {
                return true;
            }
        }
        return false;
    }
}

 

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved