gpt4 book ai didi

android - Android中的两个进程如何共享相同的代码?

转载 作者:行者123 更新时间:2023-12-04 10:32:31 24 4
gpt4 key购买 nike

我的 android 项目中有一个 util 类,它看起来像这样,

public class MyUtil {
public static final String TAG = "tim";
static IBinder mIBinder1 = new Binder();

public static void printHelloWorld() {
Log.i(TAG, "Just printing hello world from my util" + mIBinder1.toString());
}
}

我有一个在同一个应用程序中的单独进程 (:one) 下运行的服务,它看起来像这样,
public class MyService extends Service {

public static final String TAG = "tim";

public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
return new IMyAidlInterface.Stub() {

@Override
public void printHelloWorld() throws RemoteException {
Log.i(TAG, "This is just printing hello world");
MyUtil.printHelloWorld();
}
};
}
}

当我调用 printHelloWorld()在应用程序(进程 p1)的 util 类和服务类(进程 p1:one)中,我可以看到相同的值 mBinder1对象以在整个进程中打印相同的值。

通常,我们在进程之间进行通信时会进行 IPC 调用。这里的 util 代码是如何在进程之间共享的?当它们在同一个应用程序中时,如何在进程之间共享代码?

我无法理解。在这方面的一些帮助将非常有帮助。

最佳答案

活页夹实例是 不是 进程间共享。

尽管 Binder 实例在 MyUtil 中是静态的类(class),
应用程序和服务进程都将拥有自己的 MyUtil 副本。代码。

因此,应用进程为其 MyUtil 创建了 1 个静态对象。类(class),
和服务进程为其 MyUtil 创建另一个静态对象类(class)。

让我们看看它的实际效果。

1. 在单独的进程中运行服务

这是 AndroidManifest.xml。

<manifest
package="com.lakindu.staticobjectbehavior">

<application>

<service
android:name=".MyService"
android:process=":myservice" />

</application>
</manifest>

我的服务

public class MyService extends Service {
private static final String TAG = "mytest_MyService";

private final IBinder mBinder = new IMyService.Stub() {

@Override
public void printHelloWorld() throws RemoteException {
Log.i(TAG, "This is just printing hello world");
MyUtil.printHelloWorld();
}

};

@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}

我的实用程序

public class MyUtil {
private static final String TAG = "mytest_MyUtil";

private static final IBinder mMyBinder = new MyBinder();

public static void printHelloWorld() {
Log.i(TAG, "Just printing hello world from my util" + mMyBinder.toString());
}
}
MyBinder只是一个 Binder,它在每次创建对象时记录一条消息。

我的活页夹

public class MyBinder extends Binder {
private static final String TAG = "mytest_MyBinder";

public MyBinder() {
Log.d(TAG, "Creating MyBinder object");
}
}

为了测试,我编写了这个 Android 仪器测试。

应用程序/src/androidTest/StaticObjectBehaviorTest.java

import org.junit.runner.RunWith;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import androidx.test.platform.app.InstrumentationRegistry;

@RunWith(AndroidJUnit4.class)
public class StaticObjectBehaviorTest {

@Rule
public final ServiceTestRule mServiceRule = new ServiceTestRule();

@Test
public void objectCreation() throws TimeoutException, RemoteException {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

// Calling MyUtil class in test app process.
MyUtil.printHelloWorld();

Intent intent = new Intent(appContext, MyService.class);
IBinder binder = mServiceRule.bindService(intent);
assertNotNull(binder);
IMyService myService = IMyService.Stub.asInterface(binder);
assertNotNull(myService);

// Using service proxy to call MyUtil class in service process.
myService.printHelloWorld();
}

}

检查日志。

$ adb logcat | grep "mytest_"
[PID]
13054 D mytest_MyBinder: Creating MyBinder object
13054 I mytest_MyUtil: Just printing hello world from my utilcom.lakindu.staticobjectbehavior.MyBinder@5c24fc2
13089 I mytest_MyService: This is just printing hello world
13089 D mytest_MyBinder: Creating MyBinder object
13089 I mytest_MyUtil: Just printing hello world from my utilcom.lakindu.staticobjectbehavior.MyBinder@2723e12

如您所见,为每个进程创建了 2 个 Binder 对象。

2.在同一个进程中运行服务

只需更改 AndroidManifest.xml。

<manifest
package="com.lakindu.staticobjectbehavior">

<application>

<service
android:name=".MyService" />

</application>
</manifest>

没有代码更改。

检查日志。

$ adb logcat | grep "mytest_"
[PID]
13202 D mytest_MyBinder: Creating MyBinder object
13202 I mytest_MyUtil: Just printing hello world from my utilcom.lakindu.staticobjectbehavior.MyBinder@5c24fc2
13202 I mytest_MyService: This is just printing hello world
13202 I mytest_MyUtil: Just printing hello world from my utilcom.lakindu.staticobjectbehavior.MyBinder@5c24fc2

在同一个进程中运行时,只会创建一个 Binder 实例。

关于android - Android中的两个进程如何共享相同的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60356627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com