学习 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);
	}
}