├── .gitignore ├── .travis.yml ├── LICENSE ├── README-CN.md ├── README.md ├── _config.yml ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── fonts │ │ └── dnmbhs.ttf │ └── test_install.apk │ ├── java │ └── com │ │ └── blankj │ │ └── androidutilcode │ │ ├── Config.java │ │ ├── UtilsApp.java │ │ ├── activity │ │ ├── ActivityActivity.java │ │ ├── AppActivity.java │ │ ├── CleanActivity.java │ │ ├── DeviceActivity.java │ │ ├── FragmentActivity.java │ │ ├── HandlerActivity.java │ │ ├── ImageActivity.java │ │ ├── KeyboardActivity.java │ │ ├── LocationActivity.java │ │ ├── LogActivity.java │ │ ├── MainActivity.java │ │ ├── NetworkActivity.java │ │ ├── PhoneActivity.java │ │ ├── PinyinActivity.java │ │ ├── ProcessActivity.java │ │ ├── SDCardActivity.java │ │ ├── SnackbarActivity.java │ │ ├── SpannableActivity.java │ │ └── ToastActivity.java │ │ ├── base │ │ ├── BaseActivity.java │ │ ├── BaseApplication.java │ │ └── BaseFragment.java │ │ ├── fragment │ │ ├── Demo0Fragment.java │ │ ├── Demo1Fragment.java │ │ ├── Demo2Fragment.java │ │ └── Demo3Fragment.java │ │ ├── service │ │ └── LocationService.java │ │ └── transition │ │ └── DetailTransition.java │ └── res │ ├── animator │ ├── fragment_slide_left_enter.xml │ ├── fragment_slide_left_exit.xml │ ├── fragment_slide_right_enter.xml │ └── fragment_slide_right_exit.xml │ ├── drawable │ ├── lena.png │ ├── shape_spannable_block_high.xml │ ├── shape_spannable_block_low.xml │ └── shape_toast_bg.xml │ ├── layout │ ├── activity_activity.xml │ ├── activity_app.xml │ ├── activity_clean.xml │ ├── activity_device.xml │ ├── activity_flashlight.xml │ ├── activity_fragment.xml │ ├── activity_handler.xml │ ├── activity_image.xml │ ├── activity_keyboard.xml │ ├── activity_location.xml │ ├── activity_log.xml │ ├── activity_main.xml │ ├── activity_network.xml │ ├── activity_permission.xml │ ├── activity_phone.xml │ ├── activity_pinyin.xml │ ├── activity_process.xml │ ├── activity_sdcard.xml │ ├── activity_snackbar.xml │ ├── activity_spannable.xml │ ├── activity_toast.xml │ ├── fragment_demo0.xml │ ├── fragment_demo1.xml │ ├── fragment_demo2.xml │ ├── fragment_demo3.xml │ ├── snackbar_add.xml │ └── toast_custom.xml │ ├── menu │ └── about.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── provider_paths.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle ├── update_log.md └── utilcode ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── project.properties └── src ├── main ├── AndroidManifest.xml └── java │ └── com │ └── blankj │ └── utilcode │ ├── constant │ ├── MemoryConstants.java │ ├── RegexConstants.java │ └── TimeConstants.java │ └── util │ ├── ActivityUtils.java │ ├── AppUtils.java │ ├── BarUtils.java │ ├── CacheUtils.java │ ├── CameraUtils.java │ ├── CleanUtils.java │ ├── ClipboardUtils.java │ ├── CloseUtils.java │ ├── ConvertUtils.java │ ├── CrashUtils.java │ ├── DeviceUtils.java │ ├── EmptyUtils.java │ ├── EncodeUtils.java │ ├── EncryptUtils.java │ ├── FileIOUtils.java │ ├── FileUtils.java │ ├── FragmentUtils.java │ ├── HandlerUtils.java │ ├── ImageUtils.java │ ├── IntentUtils.java │ ├── KeyboardUtils.java │ ├── LocationUtils.java │ ├── LogUtils.java │ ├── LunarUtils.java │ ├── NetworkUtils.java │ ├── PermissionUtils.java │ ├── PhoneUtils.java │ ├── PinyinUtils.java │ ├── ProcessUtils.java │ ├── RegexUtils.java │ ├── SDCardUtils.java │ ├── SPUtils.java │ ├── ScreenUtils.java │ ├── ServiceUtils.java │ ├── ShellUtils.java │ ├── SizeUtils.java │ ├── SnackbarUtils.java │ ├── SpannableStringUtils.java │ ├── StringUtils.java │ ├── ThreadPoolUtils.java │ ├── TimeUtils.java │ ├── ToastUtils.java │ ├── Utils.java │ ├── VibrationUtils.java │ └── ZipUtils.java └── test ├── java └── com │ └── blankj │ └── utilcode │ └── util │ ├── ClipboardUtilsTest.java │ ├── ConvertUtilsTest.java │ ├── DogeTest.java │ ├── EmptyUtilsTest.java │ ├── EncodeUtilsTest.java │ ├── EncryptUtilsTest.java │ ├── FileIOUtilsTest.java │ ├── FileUtilsTest.java │ ├── PinyinUtilsTest.java │ ├── RegexUtilsTest.java │ ├── SDCardUtilsTest.java │ ├── SPUtilsTest.java │ ├── StringUtilsTest.java │ ├── TestUtils.java │ ├── TimeUtilsTest.java │ └── ZipUtilsTest.java └── res ├── encrypt └── MD5.txt ├── file ├── GBK.txt ├── UTF16BE.txt ├── UTF8.txt └── Unicode.txt └── zip └── testZip ├── test.txt ├── testDir └── test.txt ├── 测试.txt └── 测试文件夹 └── 测试.txt /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | /sign -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | jdk: oraclejdk8 3 | sudo: false 4 | 5 | env: 6 | global: 7 | - COMPILE_SDK_VERSION = 25 8 | - BUILD_TOOLS_VERSION = 25.0.2 9 | 10 | android: 11 | components: 12 | - platform-tools 13 | - tools 14 | - build-tools-$BUILD_TOOLS_VERSION 15 | - android-$COMPILE_SDK_VERSION 16 | 17 | licenses: 18 | - android-sdk-license-.+ 19 | - '.+' 20 | 21 | notifications: 22 | email: false 23 | 24 | before_install: 25 | - chmod +x gradlew 26 | - mkdir "$ANDROID_HOME/licenses" || true 27 | - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license" 28 | - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license" 29 | 30 | before_cache: 31 | - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock 32 | - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ 33 | cache: 34 | directories: 35 | - $HOME/.gradle/caches/ 36 | - $HOME/.gradle/wrapper/ 37 | - $HOME/.android/build-cache 38 | 39 | script: 40 | - ./gradlew build connectedCheck -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | File signPropertiesFile = rootProject.file('sign/keystore.properties') 4 | 5 | android { 6 | compileSdkVersion 25 7 | buildToolsVersion "25.0.2" 8 | 9 | defaultConfig { 10 | applicationId "com.blankj.androidutilcode" 11 | minSdkVersion 15 12 | targetSdkVersion 16 13 | versionCode 31 14 | versionName "1.5.1" 15 | } 16 | 17 | if (signPropertiesFile.exists()) { 18 | Properties properties = new Properties() 19 | properties.load(new FileInputStream(signPropertiesFile)) 20 | signingConfigs { 21 | release { 22 | storeFile rootProject.file(properties['keystore']) 23 | storePassword properties['storePassword'] 24 | keyAlias properties['keyAlias'] 25 | keyPassword properties['keyPassword'] 26 | } 27 | } 28 | } 29 | 30 | buildTypes { 31 | debug { 32 | minifyEnabled false 33 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 34 | } 35 | release { 36 | minifyEnabled true 37 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 38 | if (signPropertiesFile.exists()) { 39 | signingConfig signingConfigs.release 40 | } 41 | } 42 | } 43 | 44 | lintOptions { 45 | abortOnError false 46 | } 47 | } 48 | 49 | dependencies { 50 | compile fileTree(include: ['*.jar'], dir: 'libs') 51 | final SUPPORT_VERSION = '25.3.1' 52 | final LEAKCANARY_VERSION = '1.5'; 53 | 54 | def leakCanary = "com.squareup.leakcanary:leakcanary-android-no-op:$LEAKCANARY_VERSION" 55 | 56 | compile project(':utilcode') 57 | compile "com.android.support:appcompat-v7:$SUPPORT_VERSION" 58 | compile "com.android.support:support-v4:$SUPPORT_VERSION" 59 | compile "com.android.support:design:$SUPPORT_VERSION" 60 | 61 | // LeakCanary 62 | debugCompile "com.squareup.leakcanary:leakcanary-android:$LEAKCANARY_VERSION" 63 | releaseCompile leakCanary 64 | testCompile leakCanary 65 | } 66 | 67 | 68 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in G:\Android_IDE\ADT\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 88 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /app/src/main/assets/fonts/dnmbhs.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhnnt1/Android-UtilCode/7ea61bed331c20a2f3a161b29df9d7b18e59d772/app/src/main/assets/fonts/dnmbhs.ttf -------------------------------------------------------------------------------- /app/src/main/assets/test_install.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhnnt1/Android-UtilCode/7ea61bed331c20a2f3a161b29df9d7b18e59d772/app/src/main/assets/test_install.apk -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/Config.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode; 2 | 3 | import com.blankj.utilcode.util.Utils; 4 | 5 | import java.io.File; 6 | 7 | /** 8 | *
 9 |  *     author: Blankj
10 |  *     blog  : http://blankj.com
11 |  *     time  : 2017/05/10
12 |  *     desc  :
13 |  * 
14 | */ 15 | public class Config { 16 | public static final String PKG = "com.blankj.androidutilcode"; 17 | public static final String TEST_PKG = "com.blankj.testinstall"; 18 | private static String testApkPath; 19 | 20 | public static String getTestApkPath() { 21 | if (testApkPath == null) 22 | testApkPath = Utils.getContext().getCacheDir().getAbsolutePath() + File.separatorChar + "apk" + File.separatorChar + "test_install.apk"; 23 | return testApkPath; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/UtilsApp.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode; 2 | 3 | import com.blankj.androidutilcode.base.BaseApplication; 4 | import com.blankj.utilcode.util.CrashUtils; 5 | import com.blankj.utilcode.util.FileIOUtils; 6 | import com.blankj.utilcode.util.FileUtils; 7 | import com.blankj.utilcode.util.LogUtils; 8 | import com.blankj.utilcode.util.Utils; 9 | import com.squareup.leakcanary.LeakCanary; 10 | 11 | import java.io.IOException; 12 | 13 | /** 14 | *
15 |  *     author: Blankj
16 |  *     blog  : http://blankj.com
17 |  *     time  : 2016/10/12
18 |  *     desc  : 工具类测试App
19 |  * 
20 | */ 21 | public class UtilsApp extends BaseApplication { 22 | 23 | @Override 24 | public void onCreate() { 25 | super.onCreate(); 26 | // 内存泄露检查工具 27 | if (LeakCanary.isInAnalyzerProcess(this)) { 28 | // This process is dedicated to LeakCanary for heap analysis. 29 | // You should not init your app in this process. 30 | return; 31 | } 32 | LeakCanary.install(this); 33 | Utils.init(this); 34 | initLog(); 35 | initCrash(); 36 | initAssets(); 37 | } 38 | 39 | public static void initLog() { 40 | LogUtils.Builder builder = new LogUtils.Builder() 41 | .setLogSwitch(BuildConfig.DEBUG)// 设置log总开关,包括输出到控制台和文件,默认开 42 | .setConsoleSwitch(BuildConfig.DEBUG)// 设置是否输出到控制台开关,默认开 43 | .setGlobalTag(null)// 设置log全局标签,默认为空 44 | // 当全局标签不为空时,我们输出的log全部为该tag, 45 | // 为空时,如果传入的tag为空那就显示类名,否则显示tag 46 | .setLogHeadSwitch(true)// 设置log头信息开关,默认为开 47 | .setLog2FileSwitch(false)// 打印log时是否存到文件的开关,默认关 48 | .setDir("")// 当自定义路径为空时,写入应用的/cache/log/目录中 49 | .setBorderSwitch(true)// 输出日志是否带边框开关,默认开 50 | .setConsoleFilter(LogUtils.V)// log的控制台过滤器,和logcat过滤器同理,默认Verbose 51 | .setFileFilter(LogUtils.V);// log文件过滤器,和logcat过滤器同理,默认Verbose 52 | LogUtils.d(builder.toString()); 53 | } 54 | 55 | private void initCrash() { 56 | CrashUtils.getInstance().init(); 57 | } 58 | 59 | private void initAssets() { 60 | if (!FileUtils.isFileExists(Config.getTestApkPath())) { 61 | try { 62 | FileIOUtils.writeFileFromIS(Config.getTestApkPath(), getAssets().open("test_install.apk"), false); 63 | } catch (IOException e) { 64 | e.printStackTrace(); 65 | } 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.Config; 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.base.BaseActivity; 11 | import com.blankj.utilcode.util.ActivityUtils; 12 | 13 | /** 14 | *
15 |  *     author: Blankj
16 |  *     blog  : http://blankj.com
17 |  *     time  : 2016/10/13
18 |  *     desc  : Activity工具类Demo
19 |  * 
20 | */ 21 | public class ActivityActivity extends BaseActivity { 22 | 23 | private String imageActivityClassName; 24 | 25 | @Override 26 | public void initData(Bundle bundle) { 27 | imageActivityClassName = Config.PKG + ".activity.ImageActivity"; 28 | } 29 | 30 | @Override 31 | public int bindLayout() { 32 | return R.layout.activity_activity; 33 | } 34 | 35 | @Override 36 | public void initView(Bundle savedInstanceState, View view) { 37 | findViewById(R.id.btn_launch_image_activity).setOnClickListener(this); 38 | TextView tvAboutActivity = (TextView) findViewById(R.id.tv_about_activity); 39 | tvAboutActivity.setText("Is ImageActivity Exists: " + ActivityUtils.isActivityExists(Config.PKG, imageActivityClassName) 40 | + "\ngetLauncherActivity: " + ActivityUtils.getLauncherActivity(Config.PKG) 41 | + "\ngetTopActivity: " + ActivityUtils.getTopActivity() 42 | ); 43 | } 44 | 45 | @Override 46 | public void doBusiness(Context context) { 47 | 48 | } 49 | 50 | @Override 51 | public void onWidgetClick(View view) { 52 | switch (view.getId()) { 53 | case R.id.btn_launch_image_activity: 54 | ActivityUtils.startActivity(Config.PKG, imageActivityClassName); 55 | break; 56 | default: 57 | break; 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.Config; 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.base.BaseActivity; 11 | import com.blankj.utilcode.util.AppUtils; 12 | import com.blankj.utilcode.util.SpannableStringUtils; 13 | import com.blankj.utilcode.util.ToastUtils; 14 | 15 | /** 16 | *
 17 |  *     author: Blankj
 18 |  *     blog  : http://blankj.com
 19 |  *     time  : 2016/10/13
 20 |  *     desc  : App工具类Demo
 21 |  * 
22 | */ 23 | 24 | public class AppActivity extends BaseActivity { 25 | 26 | @Override 27 | public void initData(Bundle bundle) { 28 | 29 | } 30 | 31 | @Override 32 | public int bindLayout() { 33 | return R.layout.activity_app; 34 | } 35 | 36 | @Override 37 | public void initView(Bundle savedInstanceState, View view) { 38 | findViewById(R.id.btn_install_app).setOnClickListener(this); 39 | findViewById(R.id.btn_install_app_silent).setOnClickListener(this); 40 | findViewById(R.id.btn_uninstall_app).setOnClickListener(this); 41 | findViewById(R.id.btn_uninstall_app_silent).setOnClickListener(this); 42 | findViewById(R.id.btn_launch_app).setOnClickListener(this); 43 | findViewById(R.id.btn_get_app_details_settings).setOnClickListener(this); 44 | TextView tvAboutApp = (TextView) findViewById(R.id.tv_about_app); 45 | tvAboutApp.setText(new SpannableStringUtils.Builder().append("app icon: ") 46 | .appendLine("").setDrawable(AppUtils.getAppIcon(), SpannableStringUtils.ALIGN_CENTER) 47 | .append(AppUtils.getAppInfo().toString()) 48 | .appendLine("isAppRoot: " + AppUtils.isAppRoot()) 49 | .appendLine("isAppDebug: " + AppUtils.isAppDebug()) 50 | .appendLine("AppSignatureSHA1: " + AppUtils.getAppSignatureSHA1()) 51 | .appendLine("isAppForeground: " + AppUtils.isAppForeground()) 52 | .create()); 53 | } 54 | 55 | @Override 56 | public void doBusiness(Context context) { 57 | 58 | } 59 | 60 | @Override 61 | public void onWidgetClick(View view) { 62 | switch (view.getId()) { 63 | case R.id.btn_install_app: 64 | if (AppUtils.isInstallApp(Config.TEST_PKG)) { 65 | ToastUtils.showShort(R.string.app_install_tips); 66 | } else { 67 | AppUtils.installApp(Config.getTestApkPath(), "com.blankj.androidutilcode.provider"); 68 | } 69 | break; 70 | case R.id.btn_install_app_silent: 71 | new Thread(new Runnable() { 72 | @Override 73 | public void run() { 74 | if (AppUtils.isInstallApp(Config.TEST_PKG)) { 75 | ToastUtils.showShortSafe(R.string.app_install_tips); 76 | } else { 77 | if (AppUtils.installAppSilent(Config.getTestApkPath())) { 78 | ToastUtils.showShortSafe(R.string.install_successfully); 79 | } else { 80 | ToastUtils.showShortSafe(R.string.install_unsuccessfully); 81 | } 82 | } 83 | } 84 | }).start(); 85 | break; 86 | case R.id.btn_uninstall_app: 87 | if (AppUtils.isInstallApp(Config.TEST_PKG)) { 88 | AppUtils.uninstallApp(Config.TEST_PKG); 89 | } else { 90 | ToastUtils.showShort(R.string.app_uninstall_tips); 91 | } 92 | break; 93 | case R.id.btn_uninstall_app_silent: 94 | if (AppUtils.isInstallApp(Config.TEST_PKG)) { 95 | if (AppUtils.uninstallAppSilent(Config.TEST_PKG, false)) { 96 | ToastUtils.showShort(R.string.uninstall_successfully); 97 | } else { 98 | ToastUtils.showShort(R.string.uninstall_unsuccessfully); 99 | } 100 | } else { 101 | ToastUtils.showShort(R.string.app_uninstall_tips); 102 | } 103 | break; 104 | case R.id.btn_launch_app: 105 | AppUtils.launchApp(this.getPackageName()); 106 | break; 107 | case R.id.btn_get_app_details_settings: 108 | AppUtils.getAppDetailsSettings(); 109 | break; 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.Button; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.CleanUtils; 11 | import com.blankj.utilcode.util.ToastUtils; 12 | 13 | import java.io.File; 14 | 15 | /** 16 | *
17 |  *     author: Blankj
18 |  *     blog  : http://blankj.com
19 |  *     time  : 2016/09/29
20 |  *     desc  : Clean工具类Demo
21 |  * 
22 | */ 23 | public class CleanActivity extends BaseActivity { 24 | 25 | @Override 26 | public void initData(Bundle bundle) { 27 | 28 | } 29 | 30 | @Override 31 | public int bindLayout() { 32 | return R.layout.activity_clean; 33 | } 34 | 35 | @Override 36 | public void initView(Bundle savedInstanceState, View view) { 37 | Button btnCleanInternalCache = (Button) findViewById(R.id.btn_clean_internal_cache); 38 | Button btnCleanInternalFiles = (Button) findViewById(R.id.btn_clean_internal_files); 39 | Button btnCleanInternalDbs = (Button) findViewById(R.id.btn_clean_internal_databases); 40 | Button btnCleanInternalSP = (Button) findViewById(R.id.btn_clean_internal_sp); 41 | Button btnCleanExternalCache = (Button) findViewById(R.id.btn_clean_external_cache); 42 | btnCleanInternalCache.setOnClickListener(this); 43 | btnCleanInternalFiles.setOnClickListener(this); 44 | btnCleanInternalDbs.setOnClickListener(this); 45 | btnCleanInternalSP.setOnClickListener(this); 46 | btnCleanExternalCache.setOnClickListener(this); 47 | 48 | btnCleanInternalCache.setText(getCacheDir().getPath()); 49 | btnCleanInternalFiles.setText(getFilesDir().getPath()); 50 | btnCleanInternalDbs.setText(getFilesDir().getParent() + File.separator + "databases"); 51 | btnCleanInternalSP.setText(getFilesDir().getParent() + File.separator + "shared_prefs"); 52 | 53 | if (getExternalCacheDir() != null) { 54 | btnCleanExternalCache.setText(getExternalCacheDir().getAbsolutePath()); 55 | } 56 | } 57 | 58 | @Override 59 | public void doBusiness(Context context) { 60 | 61 | } 62 | 63 | @Override 64 | public void onWidgetClick(View view) { 65 | switch (view.getId()) { 66 | case R.id.btn_clean_internal_cache: 67 | ToastUtils.showShort("cleanInternalCache" + CleanUtils.cleanInternalCache()); 68 | break; 69 | case R.id.btn_clean_internal_files: 70 | ToastUtils.showShort("cleanInternalFiles" + CleanUtils.cleanInternalFiles()); 71 | break; 72 | case R.id.btn_clean_internal_databases: 73 | ToastUtils.showShort("cleanInternalDbs" + CleanUtils.cleanInternalDbs()); 74 | break; 75 | case R.id.btn_clean_internal_sp: 76 | ToastUtils.showShort("cleanInternalSP" + CleanUtils.cleanInternalSP()); 77 | break; 78 | case R.id.btn_clean_external_cache: 79 | ToastUtils.showShort("cleanExternalCache" + CleanUtils.cleanExternalCache()); 80 | break; 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.DeviceUtils; 11 | 12 | /** 13 | *
14 |  *     author: Blankj
15 |  *     blog : http://blankj.com
16 |  *     time : 2016/09/27
17 |  *     desc : Device工具类Demo
18 |  * 
19 | */ 20 | public class DeviceActivity extends BaseActivity { 21 | 22 | @Override 23 | public void initData(Bundle bundle) { 24 | 25 | } 26 | 27 | @Override 28 | public int bindLayout() { 29 | return R.layout.activity_device; 30 | } 31 | 32 | @Override 33 | public void initView(Bundle savedInstanceState, View view) { 34 | findViewById(R.id.btn_shutdown).setOnClickListener(this); 35 | findViewById(R.id.btn_reboot).setOnClickListener(this); 36 | findViewById(R.id.btn_reboot_to_recovery).setOnClickListener(this); 37 | findViewById(R.id.btn_reboot_to_bootloader).setOnClickListener(this); 38 | TextView tvAboutDevice = (TextView) findViewById(R.id.tv_about_device); 39 | tvAboutDevice.setText("isRoot: " + DeviceUtils.isDeviceRooted() 40 | + "\ngetSDKVersion: " + DeviceUtils.getSDKVersion() 41 | + "\ngetAndroidID: " + DeviceUtils.getAndroidID() 42 | + "\ngetMacAddress: " + DeviceUtils.getMacAddress() 43 | + "\ngetManufacturer: " + DeviceUtils.getManufacturer() 44 | + "\ngetModel: " + DeviceUtils.getModel() 45 | ); 46 | } 47 | 48 | @Override 49 | public void doBusiness(Context context) { 50 | 51 | } 52 | 53 | @Override 54 | public void onWidgetClick(View view) { 55 | switch (view.getId()) { 56 | case R.id.btn_shutdown: 57 | DeviceUtils.shutdown(); 58 | break; 59 | case R.id.btn_reboot: 60 | DeviceUtils.reboot(); 61 | break; 62 | case R.id.btn_reboot_to_recovery: 63 | DeviceUtils.reboot2Recovery(); 64 | break; 65 | case R.id.btn_reboot_to_bootloader: 66 | DeviceUtils.reboot2Bootloader(); 67 | break; 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.v4.app.Fragment; 6 | import android.view.View; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.androidutilcode.fragment.Demo0Fragment; 11 | import com.blankj.utilcode.util.FragmentUtils; 12 | 13 | import java.util.ArrayList; 14 | 15 | /** 16 | *
17 |  *     author: Blankj
18 |  *     blog  : http://blankj.com
19 |  *     time  : 17/02/01
20 |  *     desc  : Fragment工具类Demo
21 |  * 
22 | */ 23 | public class FragmentActivity extends BaseActivity { 24 | 25 | public Fragment rootFragment; 26 | 27 | @Override 28 | public void initData(Bundle bundle) { 29 | 30 | } 31 | 32 | @Override 33 | public int bindLayout() { 34 | return R.layout.activity_fragment; 35 | } 36 | 37 | @Override 38 | public void initView(Bundle savedInstanceState, View view) { 39 | 40 | } 41 | 42 | @Override 43 | public void doBusiness(Context context) { 44 | ArrayList fragments = new ArrayList<>(); 45 | fragments.add(Demo0Fragment.newInstance()); 46 | rootFragment = FragmentUtils.addFragments(getSupportFragmentManager(), fragments, R.id.fragment_container, 0); 47 | } 48 | 49 | @Override 50 | public void onWidgetClick(View view) { 51 | 52 | } 53 | 54 | 55 | @Override 56 | public void onBackPressed() { 57 | if (!FragmentUtils.dispatchBackPress(getSupportFragmentManager())) { 58 | super.onBackPressed(); 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/HandlerActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.os.Handler.Callback; 6 | import android.os.Message; 7 | import android.view.View; 8 | import android.widget.TextView; 9 | 10 | import com.blankj.androidutilcode.R; 11 | import com.blankj.androidutilcode.base.BaseActivity; 12 | import com.blankj.utilcode.util.HandlerUtils; 13 | 14 | /** 15 | *
16 |  *     author: Blankj
17 |  *     blog : http://blankj.com
18 |  *     time : 2016/09/27
19 |  *     desc : Handler工具类Demo
20 |  * 
21 | */ 22 | public class HandlerActivity extends BaseActivity 23 | implements Callback { 24 | 25 | private TextView tvAboutHandler; 26 | private HandlerUtils.HandlerHolder handlerHolder; 27 | 28 | @Override 29 | public void initData(Bundle bundle) { 30 | 31 | } 32 | 33 | @Override 34 | public int bindLayout() { 35 | return R.layout.activity_handler; 36 | } 37 | 38 | @Override 39 | public void initView(Bundle savedInstanceState, View view) { 40 | tvAboutHandler = (TextView) findViewById(R.id.tv_about_handler); 41 | findViewById(R.id.btn_send_msg_after_3s).setOnClickListener(this); 42 | } 43 | 44 | @Override 45 | public void doBusiness(Context context) { 46 | handlerHolder = new HandlerUtils.HandlerHolder(this); 47 | } 48 | 49 | @Override 50 | public void onWidgetClick(View view) { 51 | switch (view.getId()) { 52 | case R.id.btn_send_msg_after_3s: 53 | handlerHolder.sendEmptyMessageDelayed(0, 3000); 54 | break; 55 | } 56 | } 57 | 58 | @Override 59 | public boolean handleMessage(Message msg) { 60 | tvAboutHandler.setText(R.string.handler_received_msg); 61 | return false; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/ImageActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.graphics.Color; 6 | import android.os.Bundle; 7 | import android.view.View; 8 | import android.widget.ImageView; 9 | 10 | import com.blankj.androidutilcode.R; 11 | import com.blankj.androidutilcode.base.BaseActivity; 12 | import com.blankj.utilcode.util.ImageUtils; 13 | import com.blankj.utilcode.util.SizeUtils; 14 | 15 | /** 16 | *
17 |  *     author: Blankj
18 |  *     blog  : http://blankj.com
19 |  *     time  : 2016/09/26
20 |  *     desc  : Image工具类Demo
21 |  * 
22 | */ 23 | public class ImageActivity extends BaseActivity { 24 | 25 | private ImageView ivSrc; 26 | private ImageView ivView2Bitmap; 27 | 28 | @Override 29 | public void initData(Bundle bundle) { 30 | 31 | } 32 | 33 | @Override 34 | public int bindLayout() { 35 | return R.layout.activity_image; 36 | } 37 | 38 | @Override 39 | public void initView(Bundle savedInstanceState, View view) { 40 | ivSrc = (ImageView) findViewById(R.id.iv_src); 41 | ivView2Bitmap = (ImageView) findViewById(R.id.iv_view2Bitmap); 42 | ImageView ivRound = (ImageView) findViewById(R.id.iv_round); 43 | ImageView ivRoundCorner = (ImageView) findViewById(R.id.iv_round_corner); 44 | ImageView ivFastBlur = (ImageView) findViewById(R.id.iv_fast_blur); 45 | ImageView ivRenderScriptBlur = (ImageView) findViewById(R.id.iv_render_script_blur); 46 | ImageView ivStackBlur = (ImageView) findViewById(R.id.iv_stack_blur); 47 | ImageView ivAddFrame = (ImageView) findViewById(R.id.iv_add_frame); 48 | ImageView ivAddReflection = (ImageView) findViewById(R.id.iv_add_reflection); 49 | ImageView ivAddTextWatermark = (ImageView) findViewById(R.id.iv_add_text_watermark); 50 | ImageView ivAddImageWatermark = (ImageView) findViewById(R.id.iv_add_image_watermark); 51 | ImageView ivGray = (ImageView) findViewById(R.id.iv_gray); 52 | 53 | Bitmap src = ImageUtils.getBitmap(getResources(), R.drawable.lena); 54 | Bitmap watermark = ImageUtils.getBitmap(getResources(), R.mipmap.ic_launcher); 55 | 56 | SizeUtils.forceGetViewSize(ivSrc, new SizeUtils.onGetSizeListener() { 57 | @Override 58 | public void onGetSize(View view) { 59 | ivView2Bitmap.setImageBitmap(ImageUtils.view2Bitmap(ivSrc)); 60 | } 61 | }); 62 | ivRound.setImageBitmap(ImageUtils.toRound(src)); 63 | ivRoundCorner.setImageBitmap(ImageUtils.toRoundCorner(src, 60)); 64 | ivFastBlur.setImageBitmap(ImageUtils.fastBlur(src, 0.1f, 5)); 65 | ivRenderScriptBlur.setImageBitmap(ImageUtils.renderScriptBlur(src, 10)); 66 | src = ImageUtils.getBitmap(getResources(), R.drawable.lena); 67 | ivStackBlur.setImageBitmap(ImageUtils.stackBlur(src, 10, false)); 68 | ivAddFrame.setImageBitmap(ImageUtils.addFrame(src, 16, Color.GREEN)); 69 | ivAddReflection.setImageBitmap(ImageUtils.addReflection(src, 80)); 70 | ivAddTextWatermark.setImageBitmap(ImageUtils.addTextWatermark(src, "blankj", 40, 0x8800ff00, 0, 0)); 71 | ivAddImageWatermark.setImageBitmap(ImageUtils.addImageWatermark(src, watermark, 0, 0, 0x88)); 72 | ivGray.setImageBitmap(ImageUtils.toGray(src)); 73 | } 74 | 75 | @Override 76 | public void doBusiness(Context context) { 77 | 78 | } 79 | 80 | @Override 81 | public void onWidgetClick(View view) { 82 | 83 | } 84 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.graphics.Rect; 5 | import android.os.Bundle; 6 | import android.util.DisplayMetrics; 7 | import android.view.MotionEvent; 8 | import android.view.View; 9 | import android.view.inputmethod.InputMethodManager; 10 | import android.widget.EditText; 11 | import android.widget.TextView; 12 | 13 | import com.blankj.androidutilcode.R; 14 | import com.blankj.androidutilcode.base.BaseActivity; 15 | import com.blankj.utilcode.util.KeyboardUtils; 16 | import com.blankj.utilcode.util.LogUtils; 17 | 18 | /** 19 | *
 20 |  *     author: Blankj
 21 |  *     blog  : http://blankj.com
 22 |  *     time  : 2016/09/27
 23 |  *     desc  : Keyboard工具类Demo
 24 |  * 
25 | */ 26 | public class KeyboardActivity extends BaseActivity { 27 | 28 | TextView tvAboutKeyboard; 29 | 30 | @Override 31 | public void initData(Bundle bundle) { 32 | 33 | } 34 | 35 | @Override 36 | public int bindLayout() { 37 | return R.layout.activity_keyboard; 38 | } 39 | 40 | @Override 41 | public void initView(Bundle savedInstanceState, View view) { 42 | findViewById(R.id.btn_hide_soft_input).setOnClickListener(this); 43 | findViewById(R.id.btn_show_soft_input).setOnClickListener(this); 44 | findViewById(R.id.btn_toggle_soft_input).setOnClickListener(this); 45 | tvAboutKeyboard = (TextView) findViewById(R.id.tv_about_keyboard); 46 | } 47 | 48 | @Override 49 | public void doBusiness(Context context) { 50 | 51 | } 52 | 53 | @Override 54 | public void onWidgetClick(View view) { 55 | switch (view.getId()) { 56 | case R.id.btn_hide_soft_input: 57 | KeyboardUtils.hideSoftInput(this); 58 | break; 59 | case R.id.btn_show_soft_input: 60 | KeyboardUtils.showSoftInput((EditText) findViewById(R.id.et)); 61 | break; 62 | case R.id.btn_toggle_soft_input: 63 | KeyboardUtils.toggleSoftInput(); 64 | break; 65 | } 66 | } 67 | 68 | @Override 69 | public boolean dispatchTouchEvent(MotionEvent ev) { 70 | if (ev.getAction() == MotionEvent.ACTION_DOWN) { 71 | View v = getCurrentFocus(); 72 | if (isShouldHideKeyboard(v, ev)) { 73 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 74 | imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 75 | } 76 | } 77 | return super.dispatchTouchEvent(ev); 78 | } 79 | 80 | // 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘 81 | private boolean isShouldHideKeyboard(View v, MotionEvent event) { 82 | if (v != null && (v instanceof EditText)) { 83 | int[] l = {0, 0}; 84 | v.getLocationInWindow(l); 85 | int left = l[0], 86 | top = l[1], 87 | bottom = top + v.getHeight(), 88 | right = left + v.getWidth(); 89 | return !(event.getX() > left && event.getX() < right 90 | && event.getY() > top && event.getY() < bottom); 91 | } 92 | return false; 93 | } 94 | 95 | private boolean isKeyboardShown(View rootView) { 96 | final int softKeyboardHeight = 100; 97 | Rect frame = new Rect(); 98 | rootView.getWindowVisibleDisplayFrame(frame); 99 | DisplayMetrics dm = rootView.getResources().getDisplayMetrics(); 100 | int heightDiff = rootView.getBottom() - frame.bottom; 101 | LogUtils.d("" + rootView.getBottom() + ", " + frame.bottom + ", " + heightDiff); 102 | return heightDiff > softKeyboardHeight * dm.density; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/LocationActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.ComponentName; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.content.ServiceConnection; 7 | import android.os.Bundle; 8 | import android.os.IBinder; 9 | import android.view.View; 10 | import android.widget.TextView; 11 | 12 | import com.blankj.androidutilcode.R; 13 | import com.blankj.androidutilcode.base.BaseActivity; 14 | import com.blankj.androidutilcode.service.LocationService; 15 | 16 | /** 17 | *
18 |  *     author: Blankj
19 |  *     blog  : http://blankj.com
20 |  *     time  : 2016/10/13
21 |  *     desc  : Location工具类Demo
22 |  * 
23 | */ 24 | public class LocationActivity extends BaseActivity { 25 | 26 | TextView tvAboutLocation; 27 | LocationService mLocationService; 28 | 29 | @Override 30 | public void initData(Bundle bundle) { 31 | 32 | } 33 | 34 | @Override 35 | public int bindLayout() { 36 | return R.layout.activity_location; 37 | } 38 | 39 | @Override 40 | public void initView(Bundle savedInstanceState, View view) { 41 | tvAboutLocation = (TextView) findViewById(R.id.tv_about_location); 42 | tvAboutLocation.setText("lastLatitude: unknown" 43 | + "\nlastLongitude: unknown" 44 | + "\nlatitude: unknown" 45 | + "\nlongitude: unknown" 46 | + "\ngetCountryName: unknown" 47 | + "\ngetLocality: unknown" 48 | + "\ngetStreet: unknown" 49 | ); 50 | } 51 | 52 | @Override 53 | public void doBusiness(Context context) { 54 | bindService(new Intent(this, LocationService.class), conn, Context.BIND_AUTO_CREATE); 55 | } 56 | 57 | @Override 58 | public void onWidgetClick(View view) { 59 | 60 | } 61 | 62 | @Override 63 | protected void onDestroy() { 64 | unbindService(conn); 65 | super.onDestroy(); 66 | } 67 | 68 | ServiceConnection conn = new ServiceConnection() { 69 | @Override 70 | public void onServiceDisconnected(ComponentName name) { 71 | 72 | } 73 | 74 | @Override 75 | public void onServiceConnected(ComponentName name, IBinder service) { 76 | mLocationService = ((LocationService.LocationBinder) service).getService(); 77 | mLocationService.setOnGetLocationListener(new LocationService.OnGetLocationListener() { 78 | @Override 79 | public void getLocation(final String lastLatitude, final String lastLongitude, final String latitude, final String longitude, final String country, final String locality, final String street) { 80 | runOnUiThread(new Runnable() { 81 | @Override 82 | public void run() { 83 | tvAboutLocation.setText("lastLatitude: " + lastLatitude + 84 | "\nlastLongitude: " + lastLongitude + 85 | "\nlatitude: " + latitude + 86 | "\nlongitude: " + longitude + 87 | "\ngetCountryName: " + country + 88 | "\ngetLocality: " + locality + 89 | "\ngetStreet: " + street 90 | ); 91 | } 92 | }); 93 | } 94 | }); 95 | } 96 | }; 97 | } 98 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.graphics.Color; 6 | import android.net.Uri; 7 | import android.os.Bundle; 8 | import android.support.v7.widget.Toolbar; 9 | import android.view.Menu; 10 | import android.view.MenuItem; 11 | import android.view.View; 12 | 13 | import com.blankj.androidutilcode.R; 14 | import com.blankj.androidutilcode.base.BaseActivity; 15 | 16 | /** 17 | *
 18 |  *     author: Blankj
 19 |  *     blog  : http://blankj.com
 20 |  *     time  : 2016/09/29
 21 |  *     desc  : MainActivity
 22 |  * 
23 | */ 24 | public class MainActivity extends BaseActivity { 25 | 26 | @Override 27 | public void initData(Bundle bundle) { 28 | 29 | } 30 | 31 | @Override 32 | public int bindLayout() { 33 | return R.layout.activity_main; 34 | } 35 | 36 | @Override 37 | public void initView(Bundle savedInstanceState, View view) { 38 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 39 | if (toolbar != null) { 40 | toolbar.setTitleTextColor(Color.WHITE); 41 | setSupportActionBar(toolbar); 42 | } 43 | } 44 | 45 | @Override 46 | public void doBusiness(Context context) { 47 | 48 | } 49 | 50 | @Override 51 | public void onWidgetClick(View view) { 52 | 53 | } 54 | 55 | public void activityClick(View view) { 56 | startActivity(new Intent(this, ActivityActivity.class)); 57 | } 58 | 59 | public void appClick(View view) { 60 | startActivity(new Intent(this, AppActivity.class)); 61 | } 62 | 63 | public void cleanClick(View view) { 64 | startActivity(new Intent(this, CleanActivity.class)); 65 | } 66 | 67 | public void crashClick(View view) { 68 | throw new NullPointerException("crash test"); 69 | } 70 | 71 | public void deviceClick(View view) { 72 | startActivity(new Intent(this, DeviceActivity.class)); 73 | } 74 | 75 | public void fragmentClick(View view) { 76 | startActivity(new Intent(this, FragmentActivity.class)); 77 | } 78 | 79 | // public void flashlightClick(View view) { 80 | // startActivity(new Intent(this, FlashlightActivity.class)); 81 | // } 82 | 83 | public void handlerClick(View view) { 84 | startActivity(new Intent(this, HandlerActivity.class)); 85 | } 86 | 87 | public void imageClick(View view) { 88 | startActivity(new Intent(this, ImageActivity.class)); 89 | } 90 | 91 | public void keyboardClick(View view) { 92 | startActivity(new Intent(this, KeyboardActivity.class)); 93 | } 94 | 95 | public void locationClick(View view) { 96 | startActivity(new Intent(this, LocationActivity.class)); 97 | } 98 | 99 | public void logClick(View view) { 100 | startActivity(new Intent(this, LogActivity.class)); 101 | } 102 | 103 | public void networkClick(View view) { 104 | startActivity(new Intent(this, NetworkActivity.class)); 105 | } 106 | 107 | // public void permissionClick(View view) { 108 | // startActivity(new Intent(this, PermissionActivity.class)); 109 | // } 110 | 111 | public void phoneClick(View view) { 112 | startActivity(new Intent(this, PhoneActivity.class)); 113 | } 114 | 115 | public void pinyinClick(View view) { 116 | startActivity(new Intent(this, PinyinActivity.class)); 117 | } 118 | 119 | public void processClick(View view) { 120 | startActivity(new Intent(this, ProcessActivity.class)); 121 | } 122 | 123 | public void sdcardClick(View view) { 124 | startActivity(new Intent(this, SDCardActivity.class)); 125 | } 126 | 127 | public void snackbarClick(View view) { 128 | startActivity(new Intent(this, SnackbarActivity.class)); 129 | } 130 | 131 | public void spannableClick(View view) { 132 | startActivity(new Intent(this, SpannableActivity.class)); 133 | } 134 | 135 | public void toastClick(View view) { 136 | startActivity(new Intent(this, ToastActivity.class)); 137 | } 138 | 139 | 140 | @Override 141 | public boolean onCreateOptionsMenu(Menu menu) { 142 | getMenuInflater().inflate(R.menu.about, menu); 143 | return true; 144 | } 145 | 146 | @Override 147 | public boolean onOptionsItemSelected(MenuItem item) { 148 | try { 149 | switch (item.getItemId()) { 150 | 151 | case R.id.action_git_hub: 152 | 153 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/Blankj/AndroidUtilCode"))); 154 | break; 155 | case R.id.action_blog: 156 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.jianshu.com/u/46702d5c6978"))); 157 | break; 158 | } 159 | } catch (Exception e) { 160 | e.printStackTrace(); 161 | } 162 | 163 | return super.onOptionsItemSelected(item); 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.NetworkUtils; 11 | 12 | /** 13 | *
14 |  *     author: Blankj
15 |  *     blog  : http://blankj.com
16 |  *     time  : 2016/10/13
17 |  *     desc  : Network工具类Demo
18 |  * 
19 | */ 20 | public class NetworkActivity extends BaseActivity { 21 | 22 | private TextView tvAboutNetwork; 23 | 24 | @Override 25 | public void initData(Bundle bundle) { 26 | 27 | } 28 | 29 | @Override 30 | public int bindLayout() { 31 | return R.layout.activity_network; 32 | } 33 | 34 | @Override 35 | public void initView(Bundle savedInstanceState, View view) { 36 | tvAboutNetwork = (TextView) findViewById(R.id.tv_about_network); 37 | findViewById(R.id.btn_open_wireless_settings).setOnClickListener(this); 38 | findViewById(R.id.btn_set_wifi_enabled).setOnClickListener(this); 39 | setAboutNetwork(); 40 | } 41 | 42 | @Override 43 | public void doBusiness(Context context) { 44 | 45 | } 46 | 47 | @Override 48 | public void onWidgetClick(View view) { 49 | switch (view.getId()) { 50 | case R.id.btn_open_wireless_settings: 51 | NetworkUtils.openWirelessSettings(); 52 | break; 53 | case R.id.btn_set_data_enabled: 54 | NetworkUtils.setDataEnabled(!NetworkUtils.getDataEnabled()); 55 | break; 56 | case R.id.btn_set_wifi_enabled: 57 | NetworkUtils.setWifiEnabled(!NetworkUtils.getWifiEnabled()); 58 | break; 59 | } 60 | setAboutNetwork(); 61 | } 62 | 63 | private void setAboutNetwork() { 64 | tvAboutNetwork.setText("isConnected: " + NetworkUtils.isConnected() 65 | + "\nisAvailableByPing: " + NetworkUtils.isAvailableByPing() 66 | + "\ngetDataEnabled: " + NetworkUtils.getDataEnabled() 67 | + "\nis4G: " + NetworkUtils.is4G() 68 | + "\ngetWifiEnabled: " + NetworkUtils.getWifiEnabled() 69 | + "\nisWifiConnected: " + NetworkUtils.isWifiConnected() 70 | + "\nisWifiAvailable: " + NetworkUtils.isWifiAvailable() 71 | + "\nisAvailableByPing: " + NetworkUtils.isAvailableByPing() 72 | + "\ngetNetworkOperatorName: " + NetworkUtils.getNetworkOperatorName() 73 | + "\ngetNetworkTypeName: " + NetworkUtils.getNetworkType() 74 | + "\ngetIPAddress: " + NetworkUtils.getIPAddress(true) 75 | + "\ngetDomainAddress: " + NetworkUtils.getDomainAddress("baidu.com") 76 | ); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.PhoneUtils; 11 | 12 | /** 13 | *
14 |  *     author: Blankj
15 |  *     blog  : http://blankj.com
16 |  *     time  : 2016/10/13
17 |  *     desc  : Phone工具类Demo
18 |  * 
19 | */ 20 | public class PhoneActivity extends BaseActivity { 21 | 22 | @Override 23 | public void initData(Bundle bundle) { 24 | 25 | } 26 | 27 | @Override 28 | public int bindLayout() { 29 | return R.layout.activity_phone; 30 | } 31 | 32 | @Override 33 | public void initView(Bundle savedInstanceState, View view) { 34 | findViewById(R.id.btn_dial).setOnClickListener(this); 35 | findViewById(R.id.btn_call).setOnClickListener(this); 36 | findViewById(R.id.btn_send_sms).setOnClickListener(this); 37 | findViewById(R.id.btn_send_sms_silent).setOnClickListener(this); 38 | TextView tvAboutPhone = (TextView) findViewById(R.id.tv_about_phone); 39 | tvAboutPhone.setText("isPhone: " + PhoneUtils.isPhone() 40 | + "\ngetIMEI: " + PhoneUtils.getIMEI() 41 | + "\ngetIMSI: " + PhoneUtils.getIMSI() 42 | + "\ngetPhoneType: " + PhoneUtils.getPhoneType() 43 | + "\nisSimCardReady: " + PhoneUtils.isSimCardReady() 44 | + "\ngetSimOperatorName: " + PhoneUtils.getSimOperatorName() 45 | + "\ngetSimOperatorByMnc: " + PhoneUtils.getSimOperatorByMnc() 46 | + "\n获取手机状态信息: " + PhoneUtils.getPhoneStatus() 47 | ); 48 | } 49 | 50 | @Override 51 | public void doBusiness(Context context) { 52 | 53 | } 54 | 55 | @Override 56 | public void onWidgetClick(View view) { 57 | switch (view.getId()) { 58 | case R.id.btn_dial: 59 | PhoneUtils.dial("10000"); 60 | break; 61 | case R.id.btn_call: 62 | PhoneUtils.call("10000"); 63 | break; 64 | case R.id.btn_send_sms: 65 | PhoneUtils.sendSms("10000", "test"); 66 | break; 67 | case R.id.btn_send_sms_silent: 68 | PhoneUtils.sendSmsSilent("10000", "test"); 69 | break; 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/PinyinActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.PinyinUtils; 11 | 12 | /** 13 | *
14 |  *     author: Blankj
15 |  *     blog  : http://blankj.com
16 |  *     time  : 17/02/01
17 |  *     desc  : Pinyin工具类Demo
18 |  * 
19 | */ 20 | public class PinyinActivity extends BaseActivity { 21 | 22 | @Override 23 | public void initData(Bundle bundle) { 24 | 25 | } 26 | 27 | @Override 28 | public int bindLayout() { 29 | return R.layout.activity_pinyin; 30 | } 31 | 32 | @Override 33 | public void initView(Bundle savedInstanceState, View view) { 34 | TextView tvAboutPinyin = (TextView) findViewById(R.id.tv_about_pinyin); 35 | tvAboutPinyin.setText("测试拼音工具类" 36 | + "\n转拼音: " + PinyinUtils.ccs2Pinyin("测试拼音工具类", " ") 37 | + "\n获取首字母: " + PinyinUtils.getPinyinFirstLetters("测试拼音工具类", " ") 38 | + "\n澹台: " + PinyinUtils.getSurnamePinyin("澹台")); 39 | } 40 | 41 | @Override 42 | public void doBusiness(Context context) { 43 | 44 | } 45 | 46 | @Override 47 | public void onWidgetClick(View view) { 48 | 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.ProcessUtils; 11 | 12 | import java.util.Iterator; 13 | import java.util.Set; 14 | 15 | /** 16 | *
17 |  *     author: Blankj
18 |  *     blog  : http://blankj.com
19 |  *     time  : 2016/10/13
20 |  *     desc  : Process工具类Demo
21 |  * 
22 | */ 23 | public class ProcessActivity extends BaseActivity { 24 | 25 | private TextView tvAboutProcess; 26 | 27 | @Override 28 | public void initData(Bundle bundle) { 29 | 30 | } 31 | 32 | @Override 33 | public int bindLayout() { 34 | return R.layout.activity_process; 35 | } 36 | 37 | @Override 38 | public void initView(Bundle savedInstanceState, View view) { 39 | findViewById(R.id.btn_kill_all_background_processes).setOnClickListener(this); 40 | tvAboutProcess = (TextView) findViewById(R.id.tv_about_process); 41 | Set set = ProcessUtils.getAllBackgroundProcesses(); 42 | tvAboutProcess.setText("getForegroundProcessName: " + ProcessUtils.getForegroundProcessName() 43 | + "\n\ngetAllBackgroundProcesses: " + getSetItems(set) 44 | + "\nsize: " + set.size()); 45 | } 46 | 47 | @Override 48 | public void doBusiness(Context context) { 49 | 50 | } 51 | 52 | @Override 53 | public void onWidgetClick(View view) { 54 | switch (view.getId()) { 55 | case R.id.btn_kill_all_background_processes: 56 | Set set = ProcessUtils.getAllBackgroundProcesses(); 57 | Set set1 = ProcessUtils.killAllBackgroundProcesses(); 58 | tvAboutProcess.setText("getForegroundProcessName: " + ProcessUtils.getForegroundProcessName() 59 | + "\n\ngetAllBackgroundProcesses: " + getSetItems(set) 60 | + "\nsize: " + set.size() 61 | + "\n\nkillAllBackgroundProcesses: " + getSetItems(set1) 62 | + "\nsize: " + set1.size()); 63 | break; 64 | } 65 | } 66 | 67 | private String getSetItems(Set set) { 68 | Iterator iterator = set.iterator(); 69 | StringBuilder sb = new StringBuilder(); 70 | while (iterator.hasNext()) { 71 | sb.append(iterator.next()).append("\n"); 72 | } 73 | return sb.toString(); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/SDCardActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.SDCardUtils; 11 | 12 | /** 13 | *
14 |  *     author: Blankj
15 |  *     blog  : http://blankj.com
16 |  *     time  : 2016/09/27
17 |  *     desc  : SDCard工具类Demo
18 |  * 
19 | */ 20 | public class SDCardActivity extends BaseActivity { 21 | 22 | @Override 23 | public void initData(Bundle bundle) { 24 | 25 | } 26 | 27 | @Override 28 | public int bindLayout() { 29 | return R.layout.activity_sdcard; 30 | } 31 | 32 | @Override 33 | public void initView(Bundle savedInstanceState, View view) { 34 | TextView tvAboutSdcard = (TextView) findViewById(R.id.tv_about_sdcard); 35 | tvAboutSdcard.setText("isSDCardEnable: " + SDCardUtils.isSDCardEnable() 36 | + "\ngetDataPath: " + SDCardUtils.getDataPath() 37 | + "\ngetSDCardPath: " + SDCardUtils.getSDCardPath() 38 | + "\ngetFreeSpace: " + SDCardUtils.getFreeSpace() 39 | + "\ngetSDCardInfo: " + SDCardUtils.getSDCardInfo() 40 | ); 41 | } 42 | 43 | @Override 44 | public void doBusiness(Context context) { 45 | 46 | } 47 | 48 | @Override 49 | public void onWidgetClick(View view) { 50 | 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.Gravity; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.base.BaseActivity; 11 | import com.blankj.utilcode.util.ToastUtils; 12 | 13 | /** 14 | *
 15 |  *     author: Blankj
 16 |  *     blog  : http://blankj.com
 17 |  *     time  : 2016/09/29
 18 |  *     desc  : Toast工具类Demo
 19 |  * 
20 | */ 21 | public class ToastActivity extends BaseActivity { 22 | 23 | private boolean isDefaultLocation; 24 | private boolean isDefaultView; 25 | private TextView tvAboutToast; 26 | 27 | @Override 28 | public void initData(Bundle bundle) { 29 | isDefaultLocation = true; 30 | isDefaultView = true; 31 | } 32 | 33 | @Override 34 | public int bindLayout() { 35 | return R.layout.activity_toast; 36 | } 37 | 38 | @Override 39 | public void initView(Bundle savedInstanceState, View view) { 40 | findViewById(R.id.btn_toggle_location).setOnClickListener(this); 41 | findViewById(R.id.btn_toggle_view).setOnClickListener(this); 42 | findViewById(R.id.btn_show_short_toast_safe).setOnClickListener(this); 43 | findViewById(R.id.btn_show_long_toast_safe).setOnClickListener(this); 44 | findViewById(R.id.btn_show_short_toast).setOnClickListener(this); 45 | findViewById(R.id.btn_show_long_toast).setOnClickListener(this); 46 | findViewById(R.id.btn_cancel_toast).setOnClickListener(this); 47 | tvAboutToast = (TextView) findViewById(R.id.tv_about_toast); 48 | tvAboutToast.setText("is default location: " + isDefaultLocation 49 | + "\nis default view: " + isDefaultView 50 | ); 51 | } 52 | 53 | @Override 54 | public void doBusiness(Context context) { 55 | 56 | } 57 | 58 | @Override 59 | public void onWidgetClick(View view) { 60 | switch (view.getId()) { 61 | case R.id.btn_toggle_location: 62 | if (isDefaultLocation) { 63 | ToastUtils.setGravity(Gravity.CENTER, 0, 0); 64 | } else { 65 | ToastUtils.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, getResources().getDimensionPixelSize(R.dimen.offset_64)); 66 | } 67 | isDefaultLocation = !isDefaultLocation; 68 | break; 69 | case R.id.btn_toggle_view: 70 | if (isDefaultView) { 71 | ToastUtils.setView(R.layout.toast_custom); 72 | } else { 73 | ToastUtils.setView(null); 74 | } 75 | isDefaultView = !isDefaultView; 76 | break; 77 | case R.id.btn_show_short_toast_safe: 78 | new Thread(new Runnable() { 79 | @Override 80 | public void run() { 81 | ToastUtils.showShortSafe(R.string.toast_short_safe); 82 | } 83 | }).start(); 84 | break; 85 | case R.id.btn_show_long_toast_safe: 86 | new Thread(new Runnable() { 87 | @Override 88 | public void run() { 89 | ToastUtils.showLongSafe(R.string.toast_long_safe); 90 | } 91 | }).start(); 92 | break; 93 | case R.id.btn_show_short_toast: 94 | ToastUtils.showShort(R.string.toast_short); 95 | break; 96 | case R.id.btn_show_long_toast: 97 | ToastUtils.showShort(R.string.toast_long); 98 | break; 99 | case R.id.btn_cancel_toast: 100 | ToastUtils.cancel(); 101 | break; 102 | } 103 | tvAboutToast.setText("is default location: " + isDefaultLocation 104 | + "\nis default view: " + isDefaultView 105 | ); 106 | } 107 | 108 | @Override 109 | protected void onDestroy() { 110 | ToastUtils.setView(null); 111 | super.onDestroy(); 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/base/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.base; 2 | 3 | import android.content.Context; 4 | import android.os.Build; 5 | import android.os.Bundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.Window; 10 | import android.view.WindowManager; 11 | 12 | /** 13 | *
 14 |  *     author: Blankj
 15 |  *     blog  : http://blankj.com
 16 |  *     time  : 2016/10/24
 17 |  *     desc  : Activity基类
 18 |  * 
19 | */ 20 | public abstract class BaseActivity extends AppCompatActivity 21 | implements View.OnClickListener { 22 | 23 | /** 24 | * 是否全屏 25 | */ 26 | private boolean isFullScreen = false; 27 | /** 28 | * 是否沉浸状态栏 29 | */ 30 | private boolean isSteepStatusBar = false; 31 | /** 32 | * 当前Activity渲染的视图View 33 | */ 34 | protected View contentView; 35 | /** 36 | * 上次点击时间 37 | */ 38 | private long lastClick = 0; 39 | 40 | protected BaseActivity mActivity; 41 | 42 | @Override 43 | protected void onCreate(Bundle savedInstanceState) { 44 | super.onCreate(savedInstanceState); 45 | try { 46 | mActivity = this; 47 | Bundle bundle = getIntent().getExtras(); 48 | initData(bundle); 49 | contentView = LayoutInflater.from(this).inflate(bindLayout(), null); 50 | if (isFullScreen) { 51 | this.getWindow().setFlags( 52 | WindowManager.LayoutParams.FLAG_FULLSCREEN, 53 | WindowManager.LayoutParams.FLAG_FULLSCREEN); 54 | requestWindowFeature(Window.FEATURE_NO_TITLE); 55 | } 56 | if (isSteepStatusBar) { 57 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 58 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 59 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 60 | } 61 | } 62 | setContentView(contentView); 63 | initView(savedInstanceState, contentView); 64 | doBusiness(this); 65 | } catch (Exception e) { 66 | e.printStackTrace(); 67 | } 68 | } 69 | 70 | 71 | /** 72 | * 初始化数据 73 | * 74 | * @param bundle 从上个Activity传递过来的bundle 75 | */ 76 | public abstract void initData(Bundle bundle); 77 | 78 | /** 79 | * 绑定布局 80 | * 81 | * @return 布局Id 82 | */ 83 | public abstract int bindLayout(); 84 | 85 | /** 86 | * 初始化view 87 | */ 88 | public abstract void initView(Bundle savedInstanceState, final View view); 89 | 90 | /** 91 | * 业务操作 92 | * 93 | * @param context 上下文 94 | */ 95 | public abstract void doBusiness(Context context); 96 | 97 | /** 98 | * 视图点击事件 99 | * 100 | * @param view 视图 101 | */ 102 | public abstract void onWidgetClick(View view); 103 | 104 | /** 105 | * 判断是否快速点击 106 | * 107 | * @return {@code true}: 是
{@code false}: 否 108 | */ 109 | private boolean isFastClick() { 110 | long now = System.currentTimeMillis(); 111 | if (now - lastClick >= 200) { 112 | lastClick = now; 113 | return false; 114 | } 115 | return true; 116 | } 117 | 118 | @Override 119 | public void onClick(View view) { 120 | if (!isFastClick()) onWidgetClick(view); 121 | } 122 | 123 | /** 124 | * 设置是否全屏 125 | * 126 | * @param isFullScreen 是否全屏 127 | */ 128 | public void setFullScreen(boolean isFullScreen) { 129 | this.isFullScreen = isFullScreen; 130 | } 131 | 132 | /** 133 | * 设置是否沉浸状态栏 134 | * 135 | * @param isSteepStatusBar 是否沉浸状态栏 136 | */ 137 | public void setSteepStatusBar(boolean isSteepStatusBar) { 138 | this.isSteepStatusBar = isSteepStatusBar; 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/base/BaseApplication.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.base; 2 | 3 | import android.app.Activity; 4 | import android.app.Application; 5 | import android.content.Context; 6 | import android.os.Bundle; 7 | import android.util.Log; 8 | 9 | /** 10 | *
11 |  *     author: Blankj
12 |  *     blog  : http://blankj.com
13 |  *     time  : 2017/03/30
14 |  *     desc  : 基类App
15 |  * 
16 | */ 17 | public class BaseApplication extends Application { 18 | 19 | private static final String TAG = "BaseApplication"; 20 | 21 | private static BaseApplication sInstance; 22 | 23 | public static Context getInstance() { 24 | return sInstance; 25 | } 26 | 27 | @Override 28 | public void onCreate() { 29 | super.onCreate(); 30 | sInstance = this; 31 | registerActivityLifecycleCallbacks(mCallbacks); 32 | } 33 | 34 | private ActivityLifecycleCallbacks mCallbacks = new ActivityLifecycleCallbacks() { 35 | 36 | @Override 37 | public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 38 | Log.d(TAG, "onActivityCreated() called with: activity = [" + activity + "], savedInstanceState = [" + savedInstanceState + "]"); 39 | } 40 | 41 | @Override 42 | public void onActivityStarted(Activity activity) { 43 | Log.d(TAG, "onActivityStarted() called with: activity = [" + activity + "]"); 44 | } 45 | 46 | @Override 47 | public void onActivityResumed(Activity activity) { 48 | Log.d(TAG, "onActivityResumed() called with: activity = [" + activity + "]"); 49 | } 50 | 51 | @Override 52 | public void onActivityPaused(Activity activity) { 53 | Log.d(TAG, "onActivityPaused() called with: activity = [" + activity + "]"); 54 | } 55 | 56 | @Override 57 | public void onActivityStopped(Activity activity) { 58 | Log.d(TAG, "onActivityStopped() called with: activity = [" + activity + "]"); 59 | } 60 | 61 | @Override 62 | public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 63 | Log.d(TAG, "onActivitySaveInstanceState() called with: activity = [" + activity + "], outState = [" + outState + "]"); 64 | } 65 | 66 | @Override 67 | public void onActivityDestroyed(Activity activity) { 68 | Log.d(TAG, "onActivityDestroyed() called with: activity = [" + activity + "]"); 69 | } 70 | }; 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/base/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.base; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.support.v4.app.FragmentTransaction; 8 | import android.util.Log; 9 | import android.view.LayoutInflater; 10 | import android.view.View; 11 | import android.view.ViewGroup; 12 | 13 | /** 14 | *
 15 |  *     author: Blankj
 16 |  *     blog  : http://blankj.com
 17 |  *     time  : 2017/03/28
 18 |  *     desc  : Fragment-v4基类
 19 |  * 
20 | */ 21 | public abstract class BaseFragment extends Fragment 22 | implements View.OnClickListener { 23 | 24 | private static final String TAG = "BaseFragment"; 25 | 26 | private static final String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN"; 27 | /** 28 | * 当前Activity渲染的视图View 29 | */ 30 | protected View contentView; 31 | /** 32 | * 上次点击时间 33 | */ 34 | private long lastClick = 0; 35 | 36 | protected BaseActivity mActivity; 37 | 38 | @Override 39 | public void onCreate(@Nullable Bundle savedInstanceState) { 40 | super.onCreate(savedInstanceState); 41 | if (savedInstanceState != null) { 42 | boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN); 43 | FragmentTransaction ft = getFragmentManager().beginTransaction(); 44 | if (isSupportHidden) { 45 | ft.hide(this); 46 | } else { 47 | ft.show(this); 48 | } 49 | ft.commit(); 50 | } 51 | Log.d(TAG, "onCreate: "); 52 | } 53 | 54 | @Nullable 55 | @Override 56 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 57 | setRetainInstance(true); 58 | contentView = inflater.inflate(bindLayout(), null); 59 | Log.d(TAG, "onCreateView: "); 60 | return contentView; 61 | } 62 | 63 | @Override 64 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 65 | super.onViewCreated(view, savedInstanceState); 66 | Bundle bundle = getArguments(); 67 | initData(bundle); 68 | initView(savedInstanceState, contentView); 69 | Log.d(TAG, "onViewCreated: "); 70 | } 71 | 72 | @Override 73 | public void onActivityCreated(Bundle savedInstanceState) { 74 | super.onActivityCreated(savedInstanceState); 75 | mActivity = (BaseActivity) getActivity(); 76 | doBusiness(mActivity); 77 | Log.d(TAG, "onActivityCreated: "); 78 | } 79 | 80 | 81 | /** 82 | * 初始化数据 83 | * 84 | * @param bundle 传递过来的bundle 85 | */ 86 | public abstract void initData(Bundle bundle); 87 | 88 | /** 89 | * 绑定布局 90 | * 91 | * @return 布局Id 92 | */ 93 | public abstract int bindLayout(); 94 | 95 | /** 96 | * 初始化view 97 | */ 98 | public abstract void initView(Bundle savedInstanceState, final View view); 99 | 100 | /** 101 | * 业务操作 102 | * 103 | * @param context 上下文 104 | */ 105 | public abstract void doBusiness(Context context); 106 | 107 | /** 108 | * 视图点击事件 109 | * 110 | * @param view 视图 111 | */ 112 | public abstract void onWidgetClick(View view); 113 | 114 | /** 115 | * 判断是否快速点击 116 | * 117 | * @return {@code true}: 是
{@code false}: 否 118 | */ 119 | private boolean isFastClick() { 120 | long now = System.currentTimeMillis(); 121 | if (now - lastClick >= 200) { 122 | lastClick = now; 123 | return false; 124 | } 125 | return true; 126 | } 127 | 128 | @Override 129 | public void onClick(View view) { 130 | if (!isFastClick()) onWidgetClick(view); 131 | } 132 | 133 | @Override 134 | public void onDestroyView() { 135 | if (contentView != null) { 136 | ((ViewGroup) contentView.getParent()).removeView(contentView); 137 | } 138 | super.onDestroyView(); 139 | Log.d(TAG, "onDestroyView: "); 140 | } 141 | 142 | @Override 143 | public void onDestroy() { 144 | super.onDestroy(); 145 | Log.d(TAG, "onDestroy: "); 146 | } 147 | 148 | @Override 149 | public void onSaveInstanceState(Bundle outState) { 150 | super.onSaveInstanceState(outState); 151 | outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden()); 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/fragment/Demo1Fragment.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.fragment; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.activity.FragmentActivity; 11 | import com.blankj.androidutilcode.base.BaseFragment; 12 | import com.blankj.utilcode.util.FragmentUtils; 13 | 14 | import java.util.Random; 15 | 16 | /** 17 | *
18 |  *     author: Blankj
19 |  *     blog  : http://blankj.com
20 |  *     time  : 17/02/02
21 |  *     desc  :
22 |  * 
23 | */ 24 | public class Demo1Fragment extends BaseFragment { 25 | 26 | public static Demo1Fragment newInstance() { 27 | Bundle args = new Bundle(); 28 | Demo1Fragment fragment = new Demo1Fragment(); 29 | fragment.setArguments(args); 30 | return fragment; 31 | } 32 | 33 | private TextView tvAboutFragment; 34 | 35 | @Override 36 | public void initData(Bundle bundle) { 37 | 38 | } 39 | 40 | @Override 41 | public int bindLayout() { 42 | return R.layout.fragment_demo1; 43 | } 44 | 45 | @Override 46 | public void initView(Bundle savedInstanceState, View view) { 47 | Random random = new Random(); 48 | FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256))); 49 | view.findViewById(R.id.btn_show_about_fragment).setOnClickListener(this); 50 | view.findViewById(R.id.btn_hide_show).setOnClickListener(this); 51 | tvAboutFragment = (TextView) view.findViewById(R.id.tv_about_fragment); 52 | } 53 | 54 | @Override 55 | public void doBusiness(Context context) { 56 | 57 | } 58 | 59 | @Override 60 | public void onWidgetClick(View view) { 61 | tvAboutFragment.setText(""); 62 | switch (view.getId()) { 63 | case R.id.btn_show_about_fragment: 64 | tvAboutFragment.setText("lastAdd: " + FragmentUtils.getLastAddFragment(getFragmentManager()).getClass().getSimpleName() 65 | + "\nlastAddInStack: " + (FragmentUtils.getLastAddFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getLastAddFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") 66 | + "\ntopShow: " + FragmentUtils.getTopShowFragment(getFragmentManager()).getClass().getSimpleName() 67 | + "\ntopShowInStack: " + (FragmentUtils.getTopShowFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getTopShowFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") 68 | + "\n---all of fragments---\n" 69 | + FragmentUtils.getAllFragments(getFragmentManager()).toString() 70 | + "\n----------------------\n\n" 71 | + "---stack top---\n" 72 | + FragmentUtils.getAllFragmentsInStack(getFragmentManager()).toString() 73 | + "\n---stack bottom---\n\n" 74 | ); 75 | break; 76 | case R.id.btn_hide_show: 77 | FragmentUtils.hideAllShowFragment(((FragmentActivity) getActivity()).rootFragment); 78 | break; 79 | } 80 | } 81 | 82 | // @Override 83 | // public boolean onBackClick() { 84 | // LogUtils.d("onBackClick"); 85 | // FragmentUtils.showFragment(((FragmentActivity) getActivity()).rootFragment); 86 | // FragmentUtils.popFragment(getFragmentManager()); 87 | // return true; 88 | // } 89 | } 90 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/fragment/Demo2Fragment.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.fragment; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.base.BaseFragment; 11 | import com.blankj.utilcode.util.FragmentUtils; 12 | import com.blankj.utilcode.util.LogUtils; 13 | 14 | import java.util.Random; 15 | 16 | /** 17 | *
18 |  *     author: Blankj
19 |  *     blog  : http://blankj.com
20 |  *     time  : 17/02/02
21 |  *     desc  :
22 |  * 
23 | */ 24 | public class Demo2Fragment extends BaseFragment 25 | implements FragmentUtils.OnBackClickListener{ 26 | 27 | private TextView tvAboutFragment; 28 | 29 | public static Demo2Fragment newInstance() { 30 | Bundle args = new Bundle(); 31 | Demo2Fragment fragment = new Demo2Fragment(); 32 | fragment.setArguments(args); 33 | return fragment; 34 | } 35 | 36 | @Override 37 | public void initData(Bundle bundle) { 38 | 39 | } 40 | 41 | @Override 42 | public int bindLayout() { 43 | return R.layout.fragment_demo2; 44 | } 45 | 46 | @Override 47 | public void initView(Bundle savedInstanceState, View view) { 48 | Random random = new Random(); 49 | FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256))); 50 | view.findViewById(R.id.btn_show_about_fragment).setOnClickListener(this); 51 | view.findViewById(R.id.btn_pop).setOnClickListener(this); 52 | tvAboutFragment = (TextView) view.findViewById(R.id.tv_about_fragment); 53 | } 54 | 55 | @Override 56 | public void doBusiness(Context context) { 57 | 58 | } 59 | 60 | @Override 61 | public void onWidgetClick(View view) { 62 | tvAboutFragment.setText(""); 63 | switch (view.getId()) { 64 | case R.id.btn_show_about_fragment: 65 | tvAboutFragment.setText("lastAdd: " + FragmentUtils.getLastAddFragment(getFragmentManager()).getClass().getSimpleName() 66 | + "\nlastAddInStack: " + (FragmentUtils.getLastAddFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getLastAddFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") 67 | + "\ntopShow: " + FragmentUtils.getTopShowFragment(getFragmentManager()).getClass().getSimpleName() 68 | + "\ntopShowInStack: " + (FragmentUtils.getTopShowFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getTopShowFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") 69 | + "\n---all of fragments---\n" 70 | + FragmentUtils.getAllFragments(getFragmentManager()).toString() 71 | + "\n----------------------\n\n" 72 | + "---stack top---\n" 73 | + FragmentUtils.getAllFragmentsInStack(getFragmentManager()).toString() 74 | + "\n---stack bottom---\n\n" 75 | ); 76 | break; 77 | case R.id.btn_pop: 78 | FragmentUtils.popFragment(getFragmentManager()); 79 | break; 80 | } 81 | } 82 | 83 | @Override 84 | public boolean onBackClick() { 85 | LogUtils.d("demo2 onBackClick"); 86 | return false; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/service/LocationService.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.service; 2 | 3 | import android.app.Service; 4 | import android.content.Intent; 5 | import android.location.Location; 6 | import android.os.Binder; 7 | import android.os.Bundle; 8 | import android.os.IBinder; 9 | import android.os.Looper; 10 | import android.support.annotation.Nullable; 11 | 12 | import com.blankj.utilcode.util.LocationUtils; 13 | import com.blankj.utilcode.util.ToastUtils; 14 | 15 | /** 16 | *
 17 |  *     author: Blankj
 18 |  *     blog  : http://blankj.com
 19 |  *     time  : 2016/11/21
 20 |  *     desc  : Location服务
 21 |  * 
22 | */ 23 | public class LocationService extends Service { 24 | 25 | private boolean isSuccess; 26 | private String lastLatitude = "loading..."; 27 | private String lastLongitude = "loading..."; 28 | private String latitude = "loading..."; 29 | private String longitude = "loading..."; 30 | private String country = "loading..."; 31 | private String locality = "loading..."; 32 | private String street = "loading..."; 33 | private OnGetLocationListener mOnGetLocationListener; 34 | 35 | public void setOnGetLocationListener(OnGetLocationListener onGetLocationListener) { 36 | mOnGetLocationListener = onGetLocationListener; 37 | } 38 | 39 | private LocationUtils.OnLocationChangeListener mOnLocationChangeListener = new LocationUtils.OnLocationChangeListener() { 40 | @Override 41 | public void getLastKnownLocation(Location location) { 42 | lastLatitude = String.valueOf(location.getLatitude()); 43 | lastLongitude = String.valueOf(location.getLongitude()); 44 | if (mOnGetLocationListener != null) { 45 | mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street); 46 | } 47 | } 48 | 49 | @Override 50 | public void onLocationChanged(final Location location) { 51 | latitude = String.valueOf(location.getLatitude()); 52 | longitude = String.valueOf(location.getLongitude()); 53 | if (mOnGetLocationListener != null) { 54 | mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street); 55 | } 56 | country = LocationUtils.getCountryName(Double.parseDouble(latitude), Double.parseDouble(longitude)); 57 | locality = LocationUtils.getLocality(Double.parseDouble(latitude), Double.parseDouble(longitude)); 58 | street = LocationUtils.getStreet(Double.parseDouble(latitude), Double.parseDouble(longitude)); 59 | if (mOnGetLocationListener != null) { 60 | mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street); 61 | } 62 | } 63 | 64 | @Override 65 | public void onStatusChanged(String provider, int status, Bundle extras) { 66 | 67 | } 68 | }; 69 | 70 | @Override 71 | public void onCreate() { 72 | super.onCreate(); 73 | new Thread(new Runnable() { 74 | @Override 75 | public void run() { 76 | Looper.prepare(); 77 | isSuccess = LocationUtils.register(0, 0, mOnLocationChangeListener); 78 | if (isSuccess) ToastUtils.showShortSafe("init success"); 79 | Looper.loop(); 80 | } 81 | }).start(); 82 | } 83 | 84 | @Nullable 85 | @Override 86 | public IBinder onBind(Intent intent) { 87 | return new LocationBinder(); 88 | } 89 | 90 | public class LocationBinder extends Binder { 91 | public LocationService getService() { 92 | return LocationService.this; 93 | } 94 | } 95 | 96 | @Override 97 | public void onDestroy() { 98 | LocationUtils.unregister(); 99 | // 一定要制空,否则内存泄漏 100 | mOnGetLocationListener = null; 101 | super.onDestroy(); 102 | } 103 | 104 | /** 105 | * 获取位置监听器 106 | */ 107 | public interface OnGetLocationListener { 108 | void getLocation( 109 | String lastLatitude, String lastLongitude, 110 | String latitude, String longitude, 111 | String country, String locality, String street 112 | ); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/transition/DetailTransition.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.transition; 2 | 3 | import android.annotation.TargetApi; 4 | import android.content.Context; 5 | import android.os.Build; 6 | import android.transition.ChangeBounds; 7 | import android.transition.ChangeImageTransform; 8 | import android.transition.ChangeTransform; 9 | import android.transition.TransitionSet; 10 | import android.util.AttributeSet; 11 | 12 | /** 13 | *
14 |  *     author: Blankj
15 |  *     blog  : http://blankj.com
16 |  *     time  : 17/02/21
17 |  *     desc  :
18 |  * 
19 | */ 20 | @TargetApi(Build.VERSION_CODES.LOLLIPOP) 21 | public class DetailTransition extends TransitionSet { 22 | public DetailTransition() { 23 | init(); 24 | } 25 | 26 | // 允许资源文件使用 27 | public DetailTransition(Context context, AttributeSet attrs) { 28 | super(context, attrs); 29 | init(); 30 | } 31 | 32 | private void init() { 33 | setOrdering(ORDERING_TOGETHER); 34 | addTransition(new ChangeBounds()). 35 | addTransition(new ChangeTransform()). 36 | addTransition(new ChangeImageTransform()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/res/animator/fragment_slide_left_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/animator/fragment_slide_left_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/animator/fragment_slide_right_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/animator/fragment_slide_right_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/lena.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhnnt1/Android-UtilCode/7ea61bed331c20a2f3a161b29df9d7b18e59d772/app/src/main/res/drawable/lena.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_spannable_block_high.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_spannable_block_low.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_toast_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 19 | 20 |