編輯:關於Android編程
1. 首先是客戶端A發送消息給服務端B 所以在客戶端A中 聲明一個Handler用來接受消息 並創建一個Messenger對象 用Handler作為參數構造 然後onBinder方法返回 messenger.getBinder() 即可
public class MyServiceA extends Service {
private class MessageHandler extends Handler{ //創建的接受消息的handler
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
Bundle bundle = msg.getData();
String str = bundle.getString("aaa");
System.out.println("----"+str);
Messenger replyTo = msg.replyTo; //此處往下是用來回復消息給客戶端A的
Message replyMsg = Message.obtain(null,2);
Bundle bundle1 = new Bundle();
bundle1.putString("bbb","remote222給主進程回復消息啦");
replyMsg.setData(bundle1);
try {
replyTo.send(replyMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
super.handleMessage(msg);
}
}
Messenger messenger = new Messenger(new MessageHandler());
public MyServiceA() {
}
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
}
2.在客戶端A自然是需要發送消息給服務端B的 所以需要在服務綁定完成之後 獲取到binder對象 之後用該對象構造一個Messenger對象 然後用messenger發送
public void onServiceConnected(ComponentName name, IBinder service) {
Messenger messenger = new Messenger(service);
Message msg = Message.obtain(null,1);
Bundle bundle = new Bundle();
bundle.putString("aaa", "主進程給remote22進程發消息啦");
msg.setData(bundle);
msg.replyTo = mmessenger; //這行代碼用於客戶端A接收服務端請求 設置的消息接收者
try {
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
int check = checkCallingOrSelfPermission("aaa");
if(check== PackageManager.PERMISSION_DENIED){
return null;
}
//此句為了創建多進程 正常不需要使用
public static final int BOOK_CODE = 0;
public static final int USER_CODE = 1;
public static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
matcher.addURI("book uri", "book", BOOK_CODE);
matcher.addURI("user uri", "user", USER_CODE);
}
這樣我們可以通過 下面這個樣子來獲取位置(此處是表名 其他類型也一樣)
private String getTableName(Uri uri) {
switch (matcher.match(uri)) {
case BOOK_CODE:
return "bookTable";
case USER_CODE:
return "userTable";
}
return "";
}
ServerSocket serverSocket = new ServerSocket(8688);
while(isActive) { //表示服務生存著
try {
final Socket client = serverSocket.accept(); //不斷獲取客戶端連接
System.out.println("---服務端已獲取客戶端連接");
new Thread(){
@Override
public void run() {
try {
dealWithMessageFromClient(client); //處理客戶端的消息 就是開啟一個線程循環獲取out 和 in 流 進行通信
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
} catch (IOException e) {
e.printStackTrace();
}
}
Socket socket = null;
while(socket==null){ //失敗重連
try {
socket = new Socket("localhost",8688);
out = new PrintWriter(socket.getOutputStream(),true);
handler.sendEmptyMessage(1);
final Socket finalSocket = socket;
new Thread(){
@Override
public void run() {
try {
reader = new BufferedReader(new InputStreamReader(finalSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
while(!MainActivity.this.isFinishing()){ //循環獲取消息 這裡必須用 循環 否則 只能獲取一條消息 服務端也一樣
try {
String msg = reader.readLine();
System.out.println("---"+msg);
if (msg!=null){
handler.sendMessage(handler.obtainMessage(2,msg));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
} catch (IOException e) {
SystemClock.sleep(1000);
e.printStackTrace();
}
}
AndroidUI組件SlidingTabLayout實現ViewPager頁滑動效果
使用SlidingTabLayout需要准備2個類,分別是 SlidingTabLayout,與SlidingTabStrip,,放進項目中時只用修改下包名即可。 效果制
[Android] AIDL的使用情況和實例介紹
AIDL是什麼? AIDL (Android Interface Definition Language), Android接口定義語言,Android提供的IPC (
Android開發中TextView 實現右上角跟隨文本動態追加圓形紅點
在一個比較坑的需求裡,一段文字右上角需要追加一個圓形紅點。最右側有個金額,紅點動態隨著文字移動,然後各種擺布局,一下午坑死我了。後來果斷放棄。然後就想試試直接自定義vie
Android View觸摸屏事件派發機制詳解與源碼分析
PS一句:最終還是選擇CSDN來整理發表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支持MarkDown語法了,牛逼啊! 1 背景最近在簡書和微博還