/* * Copyright (c) 2014, 张涛. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kymjs.kjframe; import android.app.Activity; import android.app.FragmentTransaction; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.view.View; import org.kymjs.kjframe.ui.AnnotateUtil; import org.kymjs.kjframe.ui.I_BroadcastReg; import org.kymjs.kjframe.ui.I_KJActivity; import org.kymjs.kjframe.ui.I_SkipActivity; import org.kymjs.kjframe.ui.KJActivityStack; import org.kymjs.kjframe.ui.KJFragment; import org.kymjs.kjframe.ui.SupportFragment; import org.kymjs.kjframe.utils.KJLoger; import java.lang.ref.SoftReference; /** * @author kymjs (http://www.kymjs.com/) on 11/19/15. */ public abstract class SupportActivity extends AppCompatActivity implements View.OnClickListener, I_BroadcastReg, I_KJActivity, I_SkipActivity { public static final int WHICH_MSG = 0X37210; public Activity aty; protected KJFragment currentKJFragment; protected SupportFragment currentSupportFragment; private ThreadDataCallBack callback; private KJActivityHandle threadHandle = new KJActivityHandle(this); /** * Activity状态 */ public int activityState = DESTROY; /** * 一个私有回调类,线程中初始化数据完成后的回调 */ private interface ThreadDataCallBack { void onSuccess(); } private static class KJActivityHandle extends Handler { private final SoftReference<SupportActivity> mOuterInstance; KJActivityHandle(SupportActivity outer) { mOuterInstance = new SoftReference<>(outer); } // 当线程中初始化的数据初始化完成后,调用回调方法 @Override public void handleMessage(android.os.Message msg) { SupportActivity aty = mOuterInstance.get(); if (msg.what == WHICH_MSG && aty != null) { aty.callback.onSuccess(); } } } /** * 如果调用了initDataFromThread(),则当数据初始化完成后将回调该方法。 */ protected void threadDataInited() { } /** * 在线程中初始化数据,注意不能在这里执行UI操作 */ @Override public void initDataFromThread() { callback = new ThreadDataCallBack() { @Override public void onSuccess() { threadDataInited(); } }; } @Override public void initData() { } @Override public void initWidget() { } // 仅仅是为了代码整洁点 private void initializer() { new Thread(new Runnable() { @Override public void run() { initDataFromThread(); threadHandle.sendEmptyMessage(WHICH_MSG); } }).start(); initData(); initWidget(); } /** * listened widget's click method */ @Override public void widgetClick(View v) { } @Override public void onClick(View v) { widgetClick(v); } @SuppressWarnings("unchecked") protected <T extends View> T bindView(int id) { return (T) findViewById(id); } @SuppressWarnings("unchecked") protected <T extends View> T bindView(int id, boolean click) { T view = (T) findViewById(id); if (click) { view.setOnClickListener(this); } return view; } @Override public void registerBroadcast() { } @Override public void unRegisterBroadcast() { } /*************************************************************************** * print Activity callback methods ***************************************************************************/ @Override protected void onCreate(Bundle savedInstanceState) { aty = this; KJActivityStack.create().addActivity(this); KJLoger.state(this.getClass().getName(), "---------onCreat "); super.onCreate(savedInstanceState); setRootView(); // 必须放在annotate之前调用 AnnotateUtil.initBindView(this); initializer(); registerBroadcast(); } @Override protected void onStart() { super.onStart(); KJLoger.state(this.getClass().getName(), "---------onStart "); } @Override protected void onResume() { super.onResume(); activityState = RESUME; KJLoger.state(this.getClass().getName(), "---------onResume "); } @Override protected void onPause() { super.onPause(); activityState = PAUSE; KJLoger.state(this.getClass().getName(), "---------onPause "); } @Override protected void onStop() { super.onStop(); activityState = STOP; KJLoger.state(this.getClass().getName(), "---------onStop "); } @Override protected void onRestart() { super.onRestart(); KJLoger.state(this.getClass().getName(), "---------onRestart "); } @Override protected void onDestroy() { unRegisterBroadcast(); activityState = DESTROY; KJLoger.state(this.getClass().getName(), "---------onDestroy "); super.onDestroy(); KJActivityStack.create().finishActivity(this); currentKJFragment = null; currentSupportFragment = null; callback = null; threadHandle = null; aty = null; } /** * skip to @param(cls),and call @param(aty's) finish() method */ @Override public void skipActivity(Activity aty, Class<?> cls) { showActivity(aty, cls); aty.finish(); } /** * skip to @param(cls),and call @param(aty's) finish() method */ @Override public void skipActivity(Activity aty, Intent it) { showActivity(aty, it); aty.finish(); } /** * skip to @param(cls),and call @param(aty's) finish() method */ @Override public void skipActivity(Activity aty, Class<?> cls, Bundle extras) { showActivity(aty, cls, extras); aty.finish(); } /** * show to @param(cls),but can't finish activity */ @Override public void showActivity(Activity aty, Class<?> cls) { Intent intent = new Intent(); intent.setClass(aty, cls); aty.startActivity(intent); } /** * show to @param(cls),but can't finish activity */ @Override public void showActivity(Activity aty, Intent it) { aty.startActivity(it); } /** * show to @param(cls),but can't finish activity */ @Override public void showActivity(Activity aty, Class<?> cls, Bundle extras) { Intent intent = new Intent(); intent.putExtras(extras); intent.setClass(aty, cls); aty.startActivity(intent); } /** * 用Fragment替换视图 * * @param resView 将要被替换掉的视图 * @param targetFragment 用来替换的Fragment */ public void changeFragment(int resView, KJFragment targetFragment) { if (targetFragment.equals(currentKJFragment)) { return; } FragmentTransaction transaction = getFragmentManager() .beginTransaction(); if (!targetFragment.isAdded()) { transaction.add(resView, targetFragment, targetFragment.getClass() .getName()); } if (targetFragment.isHidden()) { transaction.show(targetFragment); targetFragment.onChange(); } if (currentKJFragment != null && currentKJFragment.isVisible()) { transaction.hide(currentKJFragment); } currentKJFragment = targetFragment; transaction.commit(); } /** * 用Fragment替换视图 * * @param resView 将要被替换掉的视图 * @param targetFragment 用来替换的Fragment */ public void changeFragment(int resView, SupportFragment targetFragment) { if (targetFragment.equals(currentSupportFragment)) { return; } android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager() .beginTransaction(); if (!targetFragment.isAdded()) { transaction.add(resView, targetFragment, targetFragment.getClass() .getName()); } if (targetFragment.isHidden()) { transaction.show(targetFragment); targetFragment.onChange(); } if (currentSupportFragment != null && currentSupportFragment.isVisible()) { transaction.hide(currentSupportFragment); } currentSupportFragment = targetFragment; transaction.commit(); } }