編輯:關於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;
}
}
我們都知道,手機時代的來臨的主要標志是啥?能夠方便的接入互聯網!互聯網展現給我們的方式一般都是網頁,網頁中又必不可少的擁有javascript,所以說,android提供
之前參加了一個課程,裡面有一節講到了用視頻作為啟動界面。講師用的是自定義VideoView,重寫onMeasure方法,因為原生的VideoView在那情況下不能實現全屏
本文參考了manymore13文章邏輯,在此基礎上做了改進:1.可定義最大行數2.定義每行顯示幾張3.當圖片數量過多時設置更多圖片由於個人較懶,去掉了xml配置屬性,所有
Android Studio 下載地址 http://www.android-studio.org/ 新手為了避免麻煩最後裝自帶SDK 1.安裝教程可看 http://