移动端 wentaitu

moonwan · June 12, 2020 · 4 hits

1.Activity 启动 Service 时,使用 Bundle 传数据,仅使用 Intent 未测试

1
2
3
4
5
6

Bundle mbundle = new Bundle();
mbundle.putStringArrayList("names", packagenames);
Intent i = new Intent(LockSettingActivity.this, WatchDogService.class);
i.putExtras(mbundle);
startService(i); // 开启杀进程服务

Service 中接收

1
2
3
4
5
6
7
8
9
10

public int (Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Bundle bundle = (Bundle)intent.getExtras();
try {
packagenames = bundle.getStringArrayList("names");
} catch (Exception e) {
packagenames = null;
}
......

参考 1:https://www.cnblogs.com/jeffen/p/6835622.html
参考 2:https://blog.csdn.net/qq_36895346/article/details/78843415

2.为何 Adapter 中设置了 get 某数据的方法,Activity 中却无法获取,按钮点击仍无法获取数据???

3.Android 线程创建与销毁,通过 Handler
https://www.cnblogs.com/ccdc/p/3837798.html
问题,服务中定义子线程,stopService() 后于 Service 的 onDestroy 中销毁线程失败???
即 handler.removeCallbacks(killAppRunnable);未销毁子线程

4.服务中:子线程逻辑执行完将自动销毁,若子线程中通过 while(true) 不断循环,子线程如何结束?
外部设置标志位 finishThreadFlag = true, onDestroy() 中设置 finishThreadFlag = false 使得服务销毁时子线程也销毁->测试成功

5.Android 进阶之进程优先级及提高优先级的方法(Service 进程防杀死)
http://www.voidcn.com/article/p-tlhnbjyl-od.html

6.
Make Project:编译 Project 下所有 Module,一般是自上次编译后 Project 下有更新的文件,不生成 apk。
Make Selected Modules:编译指定的 Module,一般是自上次编译后 Module 下有更新的文件,不生成 apk。
Clean Project:删除之前编译后的编译文件,并重新编译整个 Project,比较花费时间,不生成 apk。
Rebuild Project:先执行 Clean 操作,删除之前编译的编译文件和可执行文件,然后重新编译新的编译文件,不生成 apk,效果跟 Clean Project 一致
Build APK:前面 4 个选项都是编译,没有生成 apk 文件,如果想生成 apk,需要点击 Build APK。
Generate Signed APK:生成有签名的 apk。
注意:
对于 Clean 和 Rebuild 看到最后的效果是一样的。
平时小的改动直接用 Make Project 就可以,可以看到只有它有快捷方式,表明这个功能要经常用。对于一些大的改动比如更新 lib,大功能修改等,用 Clean 或 Rebuild,毕竟这两个编译起来要费时间。
如果有的时候死活编译不过,多试试 Clean 吧,会有意想不到的效果!

7.SparseArray Android 特有类
可看作 key 是 integer 类型的 HashMap,SparseArray 要比 HashMap 节省内存,某些情况下比 HashMap 性能更好,SparseArray 删除数据的时候也做了优化。
https://developer.android.com/reference/android/util/SparseArray

8.Android 中从 res/values/strings.xml 中读取具体的字符串的方法
String mess = getResources().getString(R.string.mess_1);
关键点 android 字符串比较,android 截取字符串,android 字符串,android 字符串数组,androidpost 字符串,android 字符串转换,
字符串资源的定义,文件路径:res/values/strings.xml
字符串资源定义示例:

1
2
3
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
47
48
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello!</string>
</resources>
```
字符串资源的调用
在 Layout XML 调用字符串资源:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
在 Activity 获取字符串资源:
`this.getString(R.string.hello)`
从 Context 获取字符串资源:
`context.getString(R.string.hello)`
从 Application 获取字符串资源:
`application.getString(R.string.hello)`

8.GLSurfaceView的内部实现
https://dymanzy.github.io/

9.Android3D模型浏览库
https://www.jianshu.com/p/3fc53eba06fc

10.更改应用包名
点击项目目录右上角设置图标->取消勾选hid empty middle packages->项目包名文件夹逐层展开->右键rename->更改app/build.gradle applicationId

11.将AS工程作为库导入另一个AS工程,是否为组件化?
仅仅留下app目录下bulid src两个文件夹,以及以这个目录文件命名的iml等其它文件
删除build.gradle文件的applicationId
修改第一行为apply plugin: 'com.android.application'
复制到另一个工程的目录下
另一个AS工程设置:
工程目录先找到settings.gadle文件,添加:include ':app',':xxx'。
再打开工程目录下的app/build.gradle文件,添加依赖工程,如下:compile project(path ':xxx')
正确完成以上操作就可以在android目录下看到两个文件夹。分别为:app和xxx
检查build.gradle(Module:app)和build.gradle(Module:sengson)两个文件下minSdkVersion和argetSdkVersion以及compileSdkVersion版本是否一致。否则会导致编译错误,可统一设置版本与另一个文件

清单文件中Application属性全部删除,未报错
异常:生成两个一样图标,另一个打开为module的Activity
答:module中activity含
``` xml
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

12.获取 Android 文件夹
存储卡根目录:Environment.getExternalStorageDirectory().toString()
Download 目录路径字符串:Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).toString()
Environment 类
public static String DIRECTORY_ALARMS;
public static String DIRECTORY_DCIM;
public static String DIRECTORY_DOCUMENTS;
public static String DIRECTORY_DOWNLOADS;
public static String DIRECTORY_MOVIES;
public static String DIRECTORY_MUSIC;
public static String DIRECTORY_NOTIFICATIONS;
public static String DIRECTORY_PICTURES;
public static String DIRECTORY_PODCASTS;
public static String DIRECTORY_RINGTONES;

//:/system
String rootDir = Environment.getRootDirectory().toString();
System.out.println(“Environment.getRootDirectory()=:” + rootDir);

//:/data 用户数据目录
String dataDir = Environment.getDataDirectory().toString();
System.out.println(“Environment.getDataDirectory()=:” + dataDir);

//:/cache 下载缓存内容目录
String cacheDir = Environment.getDownloadCacheDirectory().toString();
System.out.println(“Environment.getDownloadCacheDirectory()=:” + cacheDir);

//:/mnt/sdcard 或者/storage/emulated/0 或者/storage/sdcard0 主要的外部存储目录
String storageDir = Environment.getExternalStorageDirectory().toString();
System.out.println(“Environment.getExternalStorageDirectory()=:” + storageDir);

//:/mnt/sdcard/Pictures 或者/storage/emulated/0/Pictures 或者/storage/sdcard0/Pictures
String publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
System.out.println(“Environment.getExternalStoragePublicDirectory()=:” + publicDir);

//获取 SD 卡是否存在:mounted
String storageState = Environment.getExternalStorageState().toLowerCase();
System.out.println(“Environment.getExternalStorageState()=:” + storageState);

//设备的外存是否是用内存模拟的,是则返回 true。(API Level 11)
boolean isEmulated = Environment.isExternalStorageEmulated();
System.out.println(“Environment.isExternalStorageEmulated()=:” + isEmulated);

//设备的外存是否是可以拆卸的,比如 SD 卡,是则返回 true。(API Level 9)
boolean isRemovable = Environment.isExternalStorageRemovable();
System.out.println(“Environment.isExternalStorageRemovable()=:” + isRemovable);


//获取当前程序路径 应用在内存上的目录 :/data/data/com.mufeng.toolproject/files
String filesDir = context.getFilesDir().toString();
System.out.println(“context.getFilesDir()=:” + filesDir);

//应用的在内存上的缓存目录 :/data/data/com.mufeng.toolproject/cache
String cacheDir = context.getCacheDir().toString();
System.out.println(“context.getCacheDir()=:” + cacheDir);

//应用在外部存储上的目录 :/storage/emulated/0/Android/data/com.mufeng.toolproject/files/Movies
String externalFilesDir = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES).toString();
System.out.println(“context.getExternalFilesDir()=:” + externalFilesDir);

//应用的在外部存储上的缓存目录 :/storage/emulated/0/Android/data/com.mufeng.toolproject/cache
String externalCacheDir = context.getExternalCacheDir().toString();
System.out.println(“context.getExternalCacheDir()=:” + externalCacheDir);

//获取该程序的安装包路径 :/data/app/com.mufeng.toolproject-3.apk
String packageResourcePath = context.getPackageResourcePath();
System.out.println(“context.getPackageResourcePath()=:” + packageResourcePath);

//获取程序默认数据库路径 :/data/data/com.mufeng.toolproject/databases/mufeng
String databasePat = context.getDatabasePath(“mufeng”).toString();
System.out.println(“context.getDatabasePath(” mufeng”)=:” + databasePat);

13.判断 Android 版本
if (Build.VERSION.SDK_INT > 19) {...}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {...}

14.打开自己 APP 的系统设置,Activity 中可直接调用 getPackageName() 获取自身包名
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse(“package:” + getPackageName()));
startActivity(intent);

15.Android 中检测当前是否为主线程
如果在 Android 中判断某个线程是否是主线程?对于这个问题,你可能说根据线程的名字,当然这个可以解决问题,但是这样是最可靠的么?万一某天 Google 一下子将线程的名字改称其他呢,下面是最可靠的方法

1
2
3
public static boolean isInMainThread() {
return Looper.myLooper() == Looper.getMainLooper();
}

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.