学习 Android 不少时间了,但是有些 Java 的东西还是不是很清晰,添加笔记以便后期查看复习,希望对读者也有所帮助,不定期更新哈 ~~~
1、 java 方法的传递(即:值传递问题)
下面讨论 Java 方法的参数是 值传递 还是引用传递问题。
先说下结论:Java 方法的参数传递只有一种方式:值传递 (来自 <疯狂Java 讲义>),没有所谓的 引用传递。
值传递: 是将实际参数值的副本(复制一份)传入方法内,而实参本身不会受任何影响。
1.1、使用场景一:方法参数为基本数据类型时:这种情况比较好理解,示例如下:
public static void main(String[] args) {
int basicParams = 1;
System.out.println("基本类型-原始值:" + basicParams);
receiveBasicType(basicParams);
System.out.println("基本类型-执行方法后的值:" + basicParams);
}
public static void receiveBasicType(int rcvB){
++ rcvB;
System.out.println("基本类型输出结果:" + rcvB);
}
输出结果如下:
基本类型-原始值:1
基本类型输出结果:2
// 执行方法后原始值没有改变
基本类型-执行方法后的值:1
1.2、使用场景二:方法参数为 Object 时:
static class ExchangeData{
int a;
int b;
}
public static void main(String[] args) {
ExchangeData data = new ExchangeData();
data.a = 11;
data.b = 22;
System.out.println("原始值:a 为:" + data.a + ",b 为:" + data.b);
swap(data);
System.out.println("执行方法后:a 为:" + data.a + ",b 为:" + data.b);
swapToNull(data);
System.out.println("执行方法后:a 为:" + data.a + ",b 为:" + data.b);
}
public static void swap(ExchangeData rcvParams){
int temp = rcvParams.a;
rcvParams.a = rcvParams.b;
rcvParams.b = temp;
System.out.println("swap 方法:a 的值为:" + rcvParams.a + ",b的值为:" + rcvParams.b);
}
执行 swap() 方法结果:
原始值:a 为:11,b 为:22
swap 方法:a 的值为:22,b的值为:11
执行方法后:a 为:22,b 为:11
从上面的结果看很像 “引用传递”,但实际上不是的,下面举一个反例,code 如下:
public static void main(String[] args) {
System.out.println("原始值:a 为:" + data.a + ",b 为:" + data.b);
swapToNull(data);
System.out.println("执行方法后:a 为:" + data.a + ",b 为:" + data.b);
}
public static void swapToNull(ExchangeData rcvParams){
rcvParams = null;
}
设想一下,如果是值传递的话,由于在 swapToNull() 方法中 将 rcvParams = null,上面代码中第二处 输出会抛异常,但实际输出结果为:
原始值:a 为:11,b 为:22
执行方法后:a 为:11,b 为:22
综上:Java 中方法的参数传递为 值传递。
在 swap(ExchangeData rcvParams) 方法中 a 和 b 的值交换,是因为:man 方法中将 data 的的(复制)值 即 data 的地址 作为实参传递,形参接收到的 rvcParams 值也是指向 data 指向的对象,所以才会产生这种误解。
2、多进程操作(以 service 为例):
开启多进程:
在 AndroidManifest.xml 中注册时添加 process 属性,要以冒号开始:
<service android:name=".RemoteService"
android:process=":remot" />
关闭多进程:
//TODO 方式一:
Process.killProcess(Process.myPid());
或
android.os.Process.killProcess(android.os.Process.myPid());
//TODO 方式二:查询-close
private void fetchProcess() {
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = manager.getRunningAppProcesses();
Log.e("tag", "fetchProcess: 进程信息,个数 = " + runningAppProcesses.size() );
for(ActivityManager.RunningAppProcessInfo info : runningAppProcesses){
Log.d("stone1_act", "fetchProcess: " + info.processName );
//遍历关闭
// android.os.Process.killProcess(info.pid);
}
}