wentaitu

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();
}