/** * Copyright 2017 JessYan * * 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 com.jess.arms.base; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.AttributeSet; import android.view.View; import com.jess.arms.base.delegate.IActivity; import com.jess.arms.integration.cache.Cache; import com.jess.arms.integration.cache.CacheType; import com.jess.arms.integration.lifecycle.ActivityLifecycleable; import com.jess.arms.mvp.IPresenter; import com.jess.arms.utils.ArmsUtils; import com.trello.rxlifecycle2.android.ActivityEvent; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.Unbinder; import io.reactivex.subjects.BehaviorSubject; import io.reactivex.subjects.Subject; import static com.jess.arms.utils.ThirdViewUtil.convertAutoView; /** * ================================================ * 因为 Java 只能单继承,所以如果要用到需要继承特定 {@link Activity} 的三方库,那你就需要自己自定义 {@link Activity} * 继承于这个特定的 {@link Activity},然后再按照 {@link BaseActivity} 的格式,将代码复制过去,记住一定要实现{@link IActivity} * * Created by JessYan on 22/03/2016 * <a href="mailto:[email protected]">Contact me</a> * <a href="https://github.com/JessYanCoding">Follow me</a> * ================================================ */ public abstract class BaseActivity<P extends IPresenter> extends AppCompatActivity implements IActivity, ActivityLifecycleable { protected final String TAG = this.getClass().getSimpleName(); private final BehaviorSubject<ActivityEvent> mLifecycleSubject = BehaviorSubject.create(); private Cache<String, Object> mCache; private Unbinder mUnbinder; @Inject protected P mPresenter; @NonNull @Override public synchronized Cache<String, Object> provideCache() { if (mCache == null) { mCache = ArmsUtils.obtainAppComponentFromContext(this).cacheFactory().build(CacheType.ACTIVITY_CACHE); } return mCache; } @NonNull @Override public final Subject<ActivityEvent> provideLifecycleSubject() { return mLifecycleSubject; } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { View view = convertAutoView(name, context, attrs); return view == null ? super.onCreateView(name, context, attrs) : view; } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { int layoutResID = initView(savedInstanceState); if (layoutResID != 0) {//如果initView返回0,框架则不会调用setContentView(),当然也不会 Bind ButterKnife setContentView(layoutResID); //绑定到butterknife mUnbinder = ButterKnife.bind(this); } } catch (Exception e) { e.printStackTrace(); } initData(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); if (mUnbinder != null && mUnbinder != Unbinder.EMPTY) mUnbinder.unbind(); this.mUnbinder = null; if (mPresenter != null) mPresenter.onDestroy();//释放资源 this.mPresenter = null; } /** * 是否使用eventBus,默认为使用(true), * * @return */ @Override public boolean useEventBus() { return true; } /** * 这个Activity是否会使用Fragment,框架会根据这个属性判断是否注册{@link android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks} * 如果返回false,那意味着这个Activity不需要绑定Fragment,那你再在这个Activity中绑定继承于 {@link com.jess.arms.base.BaseFragment} 的Fragment将不起任何作用 * * @return */ @Override public boolean useFragment() { return true; } }