Android 全域性彈窗及點選響應操作
在某些場景下,比如說當我們的應用返回到後臺時,等使用者再次回到應用,要彈出一個框,作為提示,或者還有一些供使用者操作的按鈕。
功能可能比較簡單,純屬做個記錄,實現方式多樣,下面就說說
1.涉及到的頁面都繼承一個BaseActivity,差不多所有的邏輯都在這個base裡面來寫了。
2.這裡還需要知道所有的頁面此時都不可見。系統自帶了這種方法。寫一個類直接實現系統方法:Application.ActivityLifecycleCallbacks
1)public class ActivityLifecycleController implements Application.ActivityLifecycleCallbacks {
private static boolean isAppInForeground; private static int started; public ActivityLifecycleController() { started = 0; } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { ++started; } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { --started; } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } //可見的數量 public static int getStartedCount(){ return started; }
}
2)一般都會有自己的一個BaseApplication,繼承系統的Application。在onCreate方法中來初始化前面的生命週期控制類:registerActivityLifecycleCallbacks(new ActivityLifecycleController());
3.準備工作完成,使用者返回後臺的操作有可能是通過Home鍵或者選單鍵,此時通過在onStop方法中來呼叫上面控制類的方法:
int startActivityCount = ActivityLifecycleController.getStartedCount();
當數量為0時,所有的頁面都走了stop,說明此時應用已返回到了後臺。這裡可以設定一個值來記住,在onResume方法中,通過判斷此值,你可以選擇彈窗或吐司。
4.說到彈窗,現在也不建議用popwindow或者去繼承dialog。推薦使用DialogFragment,它具有更高的可複用性(降低耦合)和更好的便利性(很好的處理螢幕翻轉的情況)。例如旋屏,基於DialogFragment的對話方塊將會由FragmentManager自動重建,然而基於Dialog實現的對話方塊則沒有這樣的能力。
》》這裡寫個比較通用的方法
//新建
public static void newsInstance(FragmentManager fm) {
FragmentTransaction fragmentTransaction = fm.beginTransaction();
Fragment fragment = fm.findFragmentByTag(“TestDialog”);
if (null != fragment) {
fragmentTransaction.remove(fragment);
}
TestDialog testDialog= new TestDialog();
myDialogFragment.show(fragmentTransaction, “TestDialog”);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
View view=LayoutInflater.from(getActivity()).inflate(R.layout.fragment_dialog_study_record_rule, container,false);
return view;
}
這裡可以說下有人建立可能不是這種方法,而是在onCreateDialog方法中,但平時的使用中我並沒有採用,大多情況下彈窗都會有些圓角背景,若是用了這個方法沒有效果。若有大神知道還請告知一二。