Application
package com.sjs.dz.rzxt3.base;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;
import java.io.File;
import java.util.ArrayList;
import com.sjs.dz.rzxt3.utils.CrashHandler;
public class SysApplication extends Application {
private static SysApplication instance;
public DisplayImageOptions options;
private ArrayList<Activity> activityList = new ArrayList<Activity>();
@Override
public void onCreate() {
super.onCreate();
instance = this;
CrashHandler crashHandler=new CrashHandler();
crashHandler.init(instance);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//SDKInitializer.initialize(instance);
setImageOptions();
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//MultiDex.install(this);
}
public synchronized static SysApplication getInstance() {
return instance;
}
private void setImageOptions() {
File cacheDir = StorageUtils.getOwnCacheDirectory(this, "imageloader/Cache"); //缓存文件的存放地址
ImageLoaderConfiguration config = new ImageLoaderConfiguration
.Builder(this)
.memoryCacheExtraOptions(480, 800) // max width, max height
.threadPoolSize(3)//线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2) //降低线程的优先级保证主UI线程不受太大影响
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new WeakMemoryCache()) //建议内存设在5-10M,可以有比较好的表现 new WeakMemoryCache()
// .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //建议内存设在5-10M,可以有比较好的表现 new WeakMemoryCache()
//.memoryCacheSize(2 * 1024 * 1024)
.discCacheSize(50 * 1024 * 1024)
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.discCacheFileCount(100) //缓存的文件数量
.diskCache(new UnlimitedDiskCache(cacheDir))
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)
.writeDebugLogs() // Remove for release app
.build();
ImageLoader.getInstance().init(config);
}
public void addActivity(Activity activity) {
activityList.add(activity);
}
public void removeActivity(Activity activity) {
activityList.remove(activity);
}
/**
* 遍历所有Activity并finish
*/
public void exit() {
try {
for (Activity activity : activityList) {
activity.finish();
}
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 杀进程
*/
@Override
public void onLowMemory() {
super.onLowMemory();
System.gc();
}
}
BaseActivity
package com.sjs.dz.rzxt3;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;
import com.sjs.dz.rzxt3.R;
import com.sjs.dz.rzxt3.base.SysApplication;
public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener{
private long lastClick = 0;
public Toolbar toolbar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
SysApplication.getInstance().addActivity(this);
setContentView(getLayoutId());
initView();
loadData();
setListener();
}
@Override
public void onClick(View v) {
if (fastClick())
widgetClick(v);
}
@Override
public void finish() {
SysApplication.getInstance().removeActivity(this);
super.finish();
}
/**
* 设置ContentView
* @return R.layout.xxx
*/
protected abstract int getLayoutId();
/**
* 初始化View
*/
protected abstract void initView();
/**
* add Listener
*/
protected abstract void setListener();
/**
* 下载数据
*/
protected abstract void loadData();
/**
* 将数据更新到View
*/
protected abstract void initDateToView();
/**
* view点击
* @param v
*/
public abstract void widgetClick(View v);
/**
* 防止快速点击
* @return
*/
private boolean fastClick() {
if (System.currentTimeMillis() - lastClick <= 1000) {
return false;
}
lastClick = System.currentTimeMillis();
return true;
}
/**
* 通用ToolBar 当存在是调用 布局文件 必须包含 single_toolbar.xml
* @param title 标题内容
* @param isBack 是否存在反回功能
*/
protected void setToolBar(String title,boolean isBack) {
toolbar = $findViewById(R.id.toolbar);
toolbar.setVisibility(View.VISIBLE);
TextView tv_title = $findViewById(R.id.tv_title);
tv_title.setText(title);
toolbar.setTitle("");
setSupportActionBar(toolbar);
if (isBack) {
toolbar.setNavigationIcon(R.mipmap.ic_back_green);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
/**
* findViewById
* @param resId
* @param <T>
* @return
*/
public <T extends View> T $findViewById(int resId) {
return (T) findViewById(resId);
}
/**
* Toast
* @param msg 消息
*/
protected void $toast(CharSequence msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
/**
* startActivity
* @param cls 需要启动的Activity
*/
protected void $startActivity(Class<?> cls) {
$startActivity(cls, null);
}
/**
* startActivity 存在Bundle
* @param cls 需要启动的Activity
* @param bundle Bundle数据
*/
protected void $startActivity(Class<?> cls, Bundle bundle) {
Intent intent = new Intent(this, cls);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivity(intent);
}
/**
* startActivityForResult
* @param cls 需要启动的Activity
* @param requestCode 请求码
*/
protected void $startActivityForResult(Class<?> cls, int requestCode) {
$startActivityForResult(cls, null, requestCode);
}
/**
* startActivityForResult 存在Bundle
* @param cls 需要启动的Activity
* @param bundle Bundle数据
* @param requestCode 请求码
*/
protected void $startActivityForResult(Class<?> cls, Bundle bundle, int requestCode) {
Intent intent = new Intent(this, cls);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivityForResult(intent, requestCode);
}
/**
* 获取 传入 Bundle
* @return
*/
protected Bundle $getIntentExtra() {
Intent intent = getIntent();
Bundle bundle = null;
if (null != intent)
bundle = intent.getExtras();
return bundle;
}
}
ParentActivity
package com.sjs.dz.rzxt3;
import android.view.View;
public class ParentActivity extends BaseActivity {
@Override
protected int getLayoutId() {
return 0;
}
@Override
protected void initView() {
}
@Override
protected void setListener() {
}
@Override
protected void loadData() {
}
@Override
protected void initDateToView() {
}
@Override
public void widgetClick(View v) {
}
}