android IPC 进程间通讯
参考资料:
http://blog.csdn.net/birdsaction/article/details/39451849
在这里我说一下学习技术的方法,别人的博客,别人的东西,再简单,自己没有写过,永远是别人的。学习技术最快的方式就是参考别人的资料,然后自己动手写一个小例子,入门,hellowWorld 到大神。
有个好用的log类,写demo,还是很爽的。然后调试,看log,解决问题。我的log类如下,然后打印的时候会打印类,方法名,行数。
12-30 14:51:23.694 19372-19372/? I/Phoenix: [MainActivity:onServiceConnected:26]: 服务连接上了
package com.example.ipc;
import android.text.TextUtils;
public final class Logger {
private static final String TAG = "Phoenix";
/**
* Set true or false if you want read logs or not
*/
private static boolean logEnabled_d = true;
private static boolean logEnabled_i = true;
private static boolean logEnabled_e = true;
public static void d() {
if (logEnabled_d) {
android.util.Log.v(TAG, getLocation());
}
}
public static void d(String msg) {
if (logEnabled_d) {
android.util.Log.v(TAG, getLocation() + msg);
}
}
public static void i(String msg) {
if (logEnabled_i) {
android.util.Log.i(TAG, getLocation() + msg);
}
}
public static void i() {
if (logEnabled_i) {
android.util.Log.i(TAG, getLocation());
}
}
public static void e(String msg) {
if (logEnabled_e) {
android.util.Log.e(TAG, getLocation() + msg);
}
}
public static void e(String msg, Throwable e) {
if (logEnabled_e) {
android.util.Log.e(TAG, getLocation() + msg, e);
}
}
public static void e(Throwable e) {
if (logEnabled_e) {
android.util.Log.e(TAG, getLocation(), e);
}
}
public static void e() {
if (logEnabled_e) {
android.util.Log.e(TAG, getLocation());
}
}
private static String getLocation() {
final String className = Logger.class.getName();
final StackTraceElement[] traces = Thread.currentThread().getStackTrace();
boolean found = false;
for (StackTraceElement trace : traces) {
try {
if (found) {
if (!trace.getClassName().startsWith(className)) {
Class<?> clazz = Class.forName(trace.getClassName());
return "["
+ getClassName(clazz)
+ ":"
+ trace.getMethodName()
+ ":"
+ trace.getLineNumber()
+ "]: ";
}
} else if (trace.getClassName().startsWith(className)) {
found = true;
}
} catch (ClassNotFoundException ignored) {
}
}
return "[]: ";
}
private static String getClassName(Class<?> clazz) {
if (clazz != null) {
if (!TextUtils.isEmpty(clazz.getSimpleName())) {
return clazz.getSimpleName();
}
return getClassName(clazz.getEnclosingClass());
}
return "";
}
}
下面介绍ipc:
1.写一个service:
package com.example.ipc;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
import android.support.annotation.Nullable;
/**
* Created by caoxinyu on 2016/12/30.
* <p>
* 类的作用:
*/
public class MyService extends Service {
Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// super.handleMessage(msg);
Logger.i((String) msg.obj);
// switch (msg.what){
// case 1:
// Logger.i(msg.obj.toString());
// break;
// }
}
};
private Messenger mMessenger;
public MyService() {
}
@Override
public void onCreate() {
super.onCreate();
mMessenger = new Messenger(mHandler);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}
别忘了在androidMesfest.xml 里面注册
2.写一个activity:
package com.example.ipc;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private Messenger mMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService(new Intent(this, MyService.class), new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mMessenger = new Messenger(iBinder);
Logger.i("服务连接上了");
//服务连上之后才可以发送消息
sendMessage();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
}, Context.BIND_AUTO_CREATE);
}
private void sendMessage() {
if (mMessenger != null) {
Message message= Message.obtain();
message.what=1;
message.obj="我是从mainActivity 发送来的";
try {
mMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
其实就是进程间发消息。bindService。 不用写aidl那么麻烦。
android IPC 进程间通讯的更多相关文章
- Android Binder 进程间通讯机制梳理
什么是 Binder ? Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一.Binder的设计采用了面向对象的思想,在Binder通信模型的四 ...
- 守护进程,进程安全,IPC进程间通讯,生产者消费者模型
1.守护进程(了解)2.进程安全(*****) 互斥锁 抢票案例3.IPC进程间通讯 manager queue(*****)4.生产者消费者模型 守护进程 指的也是一个进程,可以守护着另一个进程 一 ...
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制【转】
本文转载自:https://blog.csdn.net/freekiteyu/article/details/70082302 Android-Binder进程间通讯机制 概述 最近在学习Binder ...
- ipc 进程间通讯的AIDL
1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...
- 【IPC进程间通讯之二】管道Pipe
IPC进程间通信+管道Pipe IPC(Inter-Process Communication.进程间通信). 管道用于进程间共享数据,事实上质是共享内存 ...
- 【IPC进程间通讯之中的一个】邮槽MailSlot
IPC进程间通信+邮槽MailSlot IPC(Inter-Process Communication.进程间通信). 现代计算机採用虚拟内存机制,为进程提 ...
- 【IPC进程间通讯之三】内存映射文件Mapping File
IPC进程间通信+共享内存Mapping IPC(Inter-Process Communication.进程间通信). 文件映射(Mapping)是一种 ...
- Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html 在Android中进程间通信是比较难的一部分,同时又非常 ...
- Android AIDL 进行进程间通讯(IPC)
编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...
随机推荐
- 酷狗音乐PC端怎么使用听歌识曲功能?
生活中很多时候会听到一些美妙的音乐,耳熟或者动听却不知道它的名字.就像第一眼看到你心动的那个她却不知她叫什么.移动端有酷狗音乐的听歌识曲.现在PC端也有了相同的功能,每当我们看到一部精彩影视剧听到美妙 ...
- COGS 146. [USACO Jan08] 贝茜的晨练计划
★☆ 输入文件:cowrun.in 输出文件:cowrun.out 简单对比时间限制:1 s 内存限制:32 MB 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运 ...
- word禁止自动编号
在回车.换行时使用 shift + enter
- 4 - 函数&装饰器 and 迭代器&生成器
函数是什么 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的.程序里函数的定义是: 定义:将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 ...
- Jerry Wang诚邀广大SAP同仁免费加入我的知识星球,共同探讨SAP技术问题
大家知道Jerry Wang有一个微信公众号"汪子熙",2017年12月27日,Jerry的这个公众号发布了第一篇文章.到今天2018年10月底为止,正好十个月. 在这10个月的时 ...
- Selenium入门18 断言
自动化测试需对比实际结果与预期结果,给出测试结论. 1 条件判断 if ...else... 2 assert ... #coding:utf-8 #断言 from selenium import w ...
- 腾讯CodeStar第二季前端突击队腐蚀的画解法步骤笔记
所有题目地址:http://codestar.alloyteam.com/q2 本题内容:http://www.cnblogs.com/yedeying/p/3617593.html 腐蚀的画涉及到的 ...
- IOS 自定义代理delegate方法
创建一个自定义代理 @class MJTgFooterView; /** 1.协议名称: 控件类名 + Delegate 2.代理方法普遍都是@optional 3. */ @protocol MJT ...
- IOS xcode常用的快捷键
新建 shift + cmd + n 新建项目 cmd + n 新建文件 视图 option + cmd + 回车 打开助理编辑器 cmd + 回车 ...
- .nettiers和SQLite搅合到一块之后遇到的问题
第一步 用SQLiteStudio生成一个新的数据库,sqlitetest,新建一张表test,建立一个主键字段ID,一个字符字段Name,建立完成,留待后用. 第二步 用VS2010建立一个sqli ...