Android 两个App间进行IPC通信

文章目录


前提:必须先启动DemoB的Service,DemoA与DemoB成功进行IPC。

运行结果

2021-09-12 13:52:51.986 2568-2568/com.jlink.demob D/wangrui: 通信管道正在绑定
2021-09-12 13:53:11.969 2568-2568/com.jlink.demob D/wangrui: 接收到客户端消息
2021-09-12 13:53:11.970 2568-2568/com.jlink.demob D/wangrui: 名字:王睿    年龄21

DemoA

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Button btnIPC;
    private Button btnSend;
    private Messenger messengerProxy;
    private Handler handler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            Bundle bundle = msg.getData();
            bundle.setClassLoader(MyBean.class.getClassLoader());
            MyBean myBean = bundle.getParcelable("message");
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this,myBean.getName(),Toast.LENGTH_SHORT).show();
                }
            },3000);
        }
    };

    private Messenger clientMessenger = new Messenger(handler);

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            messengerProxy = new Messenger(binder);
            Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            android.util.Log.d("wangrui","断开连接!");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnIPC = findViewById(R.id.btn_ipc);
        btnIPC.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentService = new Intent();
                intentService.setAction("com.jlink.demob.MyService");
                intentService.setPackage("com.jlink.demob");
                intentService.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                MainActivity.this.bindService(intentService, mServiceConnection, BIND_AUTO_CREATE);
            }
        });

        btnSend = findViewById(R.id.btn_send);
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                MyBean myBean = new MyBean();
//                myBean.setName("王睿对皮卡丘使用了精灵球");
                try {
                    Message message = new Message();
//                    message.replyTo = clientMessenger;
                    Bundle bundle = new Bundle();
                    bundle.putString("name", "王睿");
                    bundle.putString("age","21");
//                    bundle.putParcelable("message",myBean);
                    message.setData(bundle);
                    messengerProxy.send(message);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

MyService.java

/**
 * author : WangRui
 */
public class MyService extends Service {

    private Handler handler = new Handler(Looper.getMainLooper());
    private Messenger messenger = new Messenger(handler);


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        android.util.Log.d("wangrui","通信管道正在绑定");
        return messenger.getBinder();
    }
}

AndroidManifest.xml

        <service
            android:name=".MyService"
            android:process=":remote">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="com.jlink.demoa.MyService"/>
            </intent-filter>
        </service>

DemoB

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intentService = new Intent();
        intentService.setAction("com.jlink.demob.MyService");
        intentService.setPackage("com.jlink.demob");
        intentService.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        MainActivity.this.bindService(intentService, mServiceConnection, BIND_AUTO_CREATE);
    }

MyService.java

/**
 * author : WangRui
 */
public class MyService extends Service {

    private Handler handler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);

            android.util.Log.d("wangrui","接收到客户端消息");


//            客户端→服务端
            Bundle bundle = msg.getData();
            android.util.Log.d("wangrui","名字:" + bundle.getString("name")+"\n\n"+"年龄:" + bundle.getString("age"));
//            bundle.setClassLoader(MyBean.class.getClassLoader());
//            MyBean myBean = bundle.getParcelable("message");
//            Toast.makeText(MyService.this,myBean.getName(),Toast.LENGTH_SHORT).show();

//            //服务端→客户端
//            try {
//                Messenger clientMessenger = msg.replyTo;
//                myBean = new MyBean();
//                myBean.setName("皮卡丘对王睿使用了十万伏特");
//                bundle = new Bundle();
//                bundle.putParcelable("message",myBean);
//                Message message = new Message();
//                message.setData(bundle);
//                message.replyTo = clientMessenger;
//                clientMessenger.send(message);
//            } catch (RemoteException e) {
//                e.printStackTrace();
//            }
        }
    };

    private Messenger messenger = new Messenger(handler);


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        android.util.Log.d("wangrui","通信管道正在绑定");
        return messenger.getBinder();
    }
}

AndroidManifest.xml

        <service
            android:name=".MyService"
            android:process=":remote">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="com.jlink.demob.MyService"/>
            </intent-filter>
        </service>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要合并两个Android应用程序,您需要执行以下步骤: 1. 打开Android Studio并创建一个新项目。 2. 将两个应用程序的代码复制到新项目中。 3. 在新项目中创建一个新的模块,将两个应用程序的代码放入该模块中。 4. 在新项目中配置Gradle文件以包含两个应用程序的依赖项。 5. 在新项目中配置AndroidManifest.xml文件以包含两个应用程序的活动和服务。 6. 在新项目中运行应用程序并测试它是否正常工作。 7. 如果一切正常,您可以将新项目打包并发布到Google Play商店。 请注意,合并两个应用程序可能需要一些时和精力,因此请确保您有足够的时和资源来完成此任务。 ### 回答2: 在Android Studio中,合并两个app可以使用多个方法。一般有两种主要的方法: 1.使用library module将两个app组合在一起: 首先,你需要创建一个新的Android应用项目作为合并后的项目。接着,你需要将要合并的两个app分别导入到该项目中,导入的方式有多种,可以采用复制粘贴方式,或者使用Android Studio的导入功能。 在导入前,你需要仔细检查每一个app的gradle配置,确保每个app在构建时可以正常编译通过。接着,你需要将每个app的源代码和资源文件分别移动到新项目中的对应文件夹中。 在新项目中,你需要创建一个library module,用于组合两个app,并提供合并后的代码和资源文件。创建library module的方法可以在Android Studio中通过菜单栏:File->New->New Module->Android Library创建。在创建过程中,你需要选择正确的库名称和路径,确保它们与你项目中的其他组件一致。 一旦你创建了library module,你就可以将两个app的源代码和资源文件引用到该module中。在引用的过程中,你需要注意:如果两个app中存在相同的类或资源,你需要进行冲突处理。 最后,你需要在新项目的主build.gradle文件中添加library dependency,以使得library module在构建时可以正确引用到应用程序的其他组件。这样,你就完成了两个app的合并。 2.使用Android Studio的模块合并功能: 在Android Studio中,你可以使用“模块合并”功能将两个app合并成一个新的app。这种方法的优点是不需要手动创建library module,可以节省很多时。 首先,你需要在Android Studio中打开一个要合并的app项目,并创建一个新的app项目作为合并后的项目。接着,你需要关闭要合并的app项目,确保Android Studio只打开了新的项目。 在新的项目中,你需要访问“模块合并”功能,在菜单栏中选择:Refactor->Module Merge->Merge Modules into New Module。然后,你需要将要合并的app项目文件夹添加到合并列表中,并选择正确的build variant和资源文件夹路径。最后,你需要设置新项目中的库名称和路径。 这样,你就可以通过使用Android Studio的模块合并功能,快速简便地将两个app合并成一个新的app项目。 ### 回答3: 在合并两个Android应用的过程中,我们需要使用到Android Studio这款开发工具。Android Studio提供了许多工具和功能,用于组合两个或更多应用。 首先,我们需要创建一个新的项目来合并两个应用程序。打开Android Studio并创建一个新项目,选择空活动作为应用程序模板。 将两个应用程序的文件夹从文件系统中复制到新项目的目录下。确保两个应用程序所在的文件夹的名称不同,以防止冲突。 修改AndroidManifest.xml文件,添加新应用程序的活动和服务等元素。如果两个应用程序的Manifest文件都存在,则需要进行相应的修改,以便这些元素能够正确配置。 接下来,我们需要将两个应用程序的java文件夹合并。为了避免命名冲突,我们需要把每个应用程序放置到不同的包中。 最后,我们需要将两个应用程序的资源文件夹合并。确保在合并过程中没有重复的资源文件。如果有,则需要进行相应的修改,以便资源文件能够正确组合。 合并两个应用程序后,我们需要在Android Studio中运行和测试新应用程序。如果出现任何错误或问题,则需要进行逐个排除,直到应用程序完全正常运行。 总的来说,合并两个应用程序的过程需要耗费一定时和精力,但合并后的应用程序可以拥有更多的功能和更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值