service bound(二)
service 绑定有三种实现方式:
1. 直接继承Binder类实现。
条件: 同一应用,同一进程
2. 使用Messenger实现。
条件:要在不同的进程间通信,这种方式不用考虑线程安全性。(单线程操作时使用)
3. 使用AIDL实现。
条件:要在不同的进程间通信,并且需要多线程处理。要考虑线程之间的安全性。
通过Messenger实现bound service。
实现步骤:
- service 要实现Handler,service通过Handler可以得到客户端的调用请求。
- Handler用于创建Messenger对象。
- Messenger创建一个IBinder,client调用onBind()时,IBinder返回给client的
- Clients 通过IBinder实例化Messenger
- service 通过Handler收到每一个Message,
在 handleMessage() 方法明确的处理.
---service 要实现Handler,service通过Handler可以得到客户端的调用请求。
class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REGISTER:
if(msg.replyTo != null && !messengerList.contains(msg.replyTo)){
messengerList.add(msg.replyTo) ;
}
Toast.makeText(getApplicationContext(), "bound", Toast.LENGTH_SHORT).show();
break;
case UNREGISTER:
if(msg.replyTo != null && messengerList.contains(msg.replyTo)){
messengerList.remove(msg.replyTo) ;
}
Toast.makeText(getApplicationContext(), "unbound", Toast.LENGTH_SHORT).show();
break;
case REPLYTO:
Message message = Message.obtain(null, 1, 0, 0);
Bundle data = new Bundle() ;
data.putString("REPLYTO", "reply from service") ;
message.setData(data) ;
try {
msg.replyTo.send(message) ;
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
default:
super.handleMessage(msg);
break;
}
}
}
private Messenger messenger = new Messenger(new MessengerHandler()) ;
---Messenger创建一个IBinder,client调用onBind()时,IBinder返回给client的
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
---Clients 通过IBinder实例化Messenger
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service); //通过IBinder 实例化Messenger
mBound = true ;
registerService();
}---Service 通过Handler收到每一个Message, 在 handleMessage() 方法明确的处理.
try {
Message msg = Message.obtain(null , MessengerService.REGISTER,0,0) ;
msg.replyTo = mMessenger ;
mService.send(msg) ;
} catch (RemoteException e) {
e.printStackTrace();
}Service的所有code:
package com.hualu.serviceexample.messenger;
import java.util.ArrayList;
import java.util.List;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.widget.Toast;
/**
* 测试不在同一个进程中, 不需要考虑线程安全性
* @author Administrator
*
*/
public class MessengerService extends Service {
final static int REGISTER = 1;
final static int UNREGISTER = 2;
final static int REPLYTO = 3;
private Messenger messenger = new Messenger(new MessengerHandler()) ;
private List<Messenger> messengerList = new ArrayList<Messenger>() ;
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REGISTER:
if(msg.replyTo != null && !messengerList.contains(msg.replyTo)){
messengerList.add(msg.replyTo) ;
}
Toast.makeText(getApplicationContext(), "bound", Toast.LENGTH_SHORT).show();
break;
case UNREGISTER:
if(msg.replyTo != null && messengerList.contains(msg.replyTo)){
messengerList.remove(msg.replyTo) ;
}
Toast.makeText(getApplicationContext(), "unbound", Toast.LENGTH_SHORT).show();
break;
case REPLYTO:
Message message = Message.obtain(null, 1, 0, 0);
Bundle data = new Bundle() ;
data.putString("REPLYTO", "reply from service") ;
message.setData(data) ;
try {
msg.replyTo.send(message) ;
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
default:
super.handleMessage(msg);
break;
}
}
}
}
Activity 中所有的Code:
package com.hualu.serviceexample.messenger;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.hualu.serviceexample.R;
public class MessengerActivity extends Activity implements OnClickListener{
private Messenger mService ;
private boolean mBound ;
private Button messenger, unBound, replyFromService ;
private TextView text ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_binder_messenger) ;
text = (TextView)this.findViewById(R.id.textView1) ;
messenger = (Button)this.findViewById(R.id.messenger) ;
unBound = (Button)this.findViewById(R.id.unbound) ;
replyFromService = (Button)this.findViewById(R.id.reply_from_service) ;
messenger.setOnClickListener(this) ;
unBound.setOnClickListener(this) ;
replyFromService.setOnClickListener(this) ;
}
private ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service); ;
mBound = true ;
registerService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
mBound = false ;
}
} ;
@Override
protected void onStart() {
super.onStart() ;
boundService() ;
};
@Override
protected void onStop() {
super.onStop() ;
if(mBound){
unbindService(conn);
mMessenger = null;
mBound = false;
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.messenger:
boundService();
break;
case R.id.unbound:
unBoundService() ;
break ;
case R.id.reply_from_service:
replyFromService() ;
break;
}
}
private void boundService() {
bindService(new Intent("com.hualu.serviceexample.BIND_MESSENGER_SERVICE"), conn, Context.BIND_AUTO_CREATE) ;
text.setText("bound") ;
}
private void registerService(){
try {
Message msg = Message.obtain(null , MessengerService.REGISTER,0,0) ;
msg.replyTo = mMessenger ;
mService.send(msg) ;
} catch (RemoteException e) {
e.printStackTrace();
}
}
private void replyFromService() {
if(mService != null){
try {
Message msg = Message.obtain(null , MessengerService.REPLYTO,0,0) ;
msg.replyTo = mMessenger ;
mService.send(msg) ;
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
private void unBoundService() {
if (mBound) {
if(mService != null){
Message msg = Message.obtain(null , MessengerService.UNREGISTER,0,0) ;
msg.replyTo = mMessenger ;
try {
mService.send(msg) ;
} catch (RemoteException e) {
e.printStackTrace();
}
}
unbindService(conn) ;
mBound =false;
mService = null;
text.setText("unbound") ;
}
};
private Messenger mMessenger = new Messenger(new MessengerActivityHandler()) ;
class MessengerActivityHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Bundle data = msg.getData() ;
String str = data.getString("REPLYTO");
text.setText(str) ;
break;
default:
super.handleMessage(msg);
break;
}
}
}
}
在activity和service中,实现了双向通道,既可以从activity中发送消息给service,也可以从service中发送消息给activity。都是通过Messenger实现的。
activity中的registerService()和unBoundService()方法,发送消息到service中;
replyFromService()是既发送消息到service中,又收到service返回的消息。
与上面说的对应的是在service里面的Handler的handleMessage()里面
Layout文件的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical" >
<Button
android:id="@+id/messenger"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/messenger" />
<Button
android:id="@+id/unbound"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/unbound_messenger" />
<Button
android:id="@+id/reply_from_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/reply_from_service" />
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="TextView" />
</LinearLayout>Manifest中相关的code:
<activity android:name=".messenger.MessengerActivity">
<intent-filter>
<action android:name="com.hualu.serviceexample.BIND_MESSENGER_ACTIVITY"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
<service android:name=".messenger.MessengerService">
<intent-filter>
<action android:name="com.hualu.serviceexample.BIND_MESSENGER_SERVICE"></action>
</intent-filter>
</service>实际上从2009年初高通收购了AMD的移动设备资产后,业界就多次传出了高通将要整体收购AMD的消息,2012年9月就曾第一次有消息爆料高通将收购AMD全部资产,而在进入2013年后,这样的消息依然不断的被传出,虽然后来它们都被证实只是谣言。
2013年4月5日,一名带有官方认证的微博用户爆料称高通已全面收购AMD,此微博一出引起业界哗然。不过随后AMD大中华区董事总经理潘晓敏就 辟谣称没有听说高通已经收购AMD,而AMD中国负责公关的负责人随后也确认AMD中国并没有获得类似的消息,并对这样的传闻不做任何评价。
那么,为什么高通屡次被传闻将收购AMD,如果真的完成收购将会对芯片生产领域乃至整个业界产生什么样的影响呢?
AMD总部位于美国加州硅谷内森尼韦尔,主要业务集中在PC中央处理器、图形处理器、闪存、芯片组以及其他半导体技术,是目前在Cpu芯片领域唯一能够与英特尔抗衡的厂商。
高通是全球通信行业的重要芯片和技术厂商,总部位于美国加州圣迭戈市,它所持有的CDMA通讯制式被国际电信联盟(ITU)认可成为全球2G标准之一。
有收购先例的高通:
2009年1月20日,高通公司宣布以6500万美元的价格收购了AMD所持有的移动终端业务,一同收购的部分还包括与之相关的多媒体技术资产、知识产权和相关的研发与技术人员。
根据双方当时的协议,高通将继续雇佣AMD负责移动终端业务的所有团队,这些团队负责研发包括2D与3D图形、音频、视频、显示和架构领域在内的移动终端技术。高通中国的相关人士在解释这次收购时,强调这一行为将帮助高通进一步巩固其在移动芯片设计领域的领先优势。
收购完成后,时任高通执行副总裁Steve Mollenkopf曾表示:
“AMD在移动终端领域业务的多媒体性能够直接融合到高通的芯片产品中。”
实际上AMD将移动终端业务剥离并出售给高通,是因为当时他们正受到金融危机的强烈冲击,以主动剥离非核心业务来保持公司正常运转,对此事件,时任AMD首席运营与行政官兼首席财务官的Robert J. Rivet表示:
“AMD将把更多的精力集中在X86构架和芯片以及高端的图形芯片领域这类的核心业务上来。”
所以,有了这次收购行动,在后来的几年中,一旦AMD在公司层面经营不顺利,就会出现将会被高通收购的传言,不过深陷收购AMD传闻的公司,可不止高通一家。
业界众多大佬牵扯收购AMD疑云
2012年8月,又有传言称高通将收购AMD,而在刚更换了首席销售官不久,三星也被添加进了收购AMD的名单中,实际上除了三星和高通,还有几家业界大佬也被传言将收购AMD。
这一次收购传闻,缘于AMD下调了2012年第二财季的营收预期,由于财政营收达不到预期,加之市场份额处于增长缓慢的阶段,股价也一度跌至4美元左右,于是AMD将被收购的流言便四散开来,而在传闻中除了高通,三星,苹果和英特尔榜上有名。
三星在2012年初招募了多位来自AMD的服务器芯片开发人员,业界猜测三星将要进军低端服务器市场,而收购AMD也并非三星不能做到的事情,利用AMD的专利技术,三星可以在专利层面摆脱苹果的纠缠,也能够吸收AMD在图形处理等领域的优势。
苹果通过收购AMD可以为旗下的笔记本产品提供价格更低的处理器芯片,甚至在将来为苹果的移动终端提供芯片,并进一步完善苹果封闭的智能生态系统。
而对于英特尔来说,直接收购市场中最大的竞争对手,也是一个不错的选择,尤其是利用AMD在收购ATI后快速成长的图形处理技术,可以帮助自己更好的发展这部分的芯片业务。
实际上,业界大佬大多对收购AMD没有兴趣
谣言总是能够很快的传播出去,而事实总也是按照现实发展的规律逐步展现,AMD将被各类公司收购的消息已经流传多年,如果从AMD和被传言涉及的公司现实状况来看,很多流言都经不起细致的推敲。
从技术的角度上来说,无论是高通还是三星,在ARM构架盛行的今天,收购AMD的业务是没有意义的,相反的这些公司都在大举挖角的旗帜,不断从AMD挖来他们所需的技术人员,这一点就足够了也就无需化大价钱来收购整个AMD。
对于英特尔来说,X86构架的芯片组已经由Surface Pro等设备证明可以高效,便携的使用在移动终端上,所以也不需要收购对手来达到在移动终端市场的扩张。
其次,AMD手中握有的专利价值并不高,从处理器行业的角度来看,在进入移动终端高速发展的今天,厂商更愿意从ARM手中购买专利技术,而不是技术相对落后并且没有完整移动芯片产品线的AMD。
虽然AMD市值只有20亿美元,但收购方依然要承担超过10亿美元的净债务,即使上述这些公司完全有财力收购AMD,但依然要考虑收购后所带来的债务压力。
微软怎么看
作为忠实的合作伙伴和产品支持者,高通对于微软的重要性不言而喻,从MWC 2013上高通与微软的互动就能看出。智能手机领域中,Snapdragon在Windows Phone中的使用,就是良好合作的开端。而在面对Windows 8和Windows RT设备的发展中,微软采取了不同的战略,目前基于Windows 8系统的移动终端选择的是英特尔的X86构架,而作为Windows RT设备标杆的Surface RT则使用的是NVIDIA的ARM架构芯片。照目前的发展情况来看,下一代的Surface RT产品将很有可能放弃NVIDIA的芯片,如果使用高通或者其他厂商的芯片,那么势必会引起整个平板市场的剧烈变动。
但如果AMD真的被高通收购了
面对英特尔在PC处理器市场以及ARM在移动芯片市场的垄断时,高通曾在2011年表示要谋求Windows 8的帮助,来打破目前市场的局面。高通首先希望通过在智能手机、平板电脑,甚至PC中推广Snapdragon处理器,来扩大在移动处理器领域的领先地 位。然后高通借助收购AMD更进一步的进入PC、服务器市场,提供全平台的芯片方案,完成对英特尔的合围。
对于普通消费者来说,如果高通加入到这一领域,引入更多的竞争机制将会导致今后购买Windows 8系统的移动终端的费用将大大降低。
AMD何去何从
英特尔和AMD称霸芯片市场的局面已一去不返,ARM和高通的快速崛起将对传统芯片生产行业造成巨大的冲击,身陷囹圄的AMD要么通过自身产业重 组,提出新的发展战略突破难关,要么就等待宣布破产,出售持有的专利和业务来偿还债务。如果一心想要通过其他公司以收购自己的方式存活,那么就只能证明 AMD的时代已经终结。
于正代班“非诚勿扰”
知名编剧于正代班乐嘉担任江苏卫视《非诚勿扰》节目的情感点评嘉宾,节目播出之前就引起了不少关注,而在节目开始前,于正还发了一条微博为自己打气。4月6日播出他代班的首期节目中,于正和孟非、黄菡的搭档比较默契,并未出现冷场的情况,而他的点评风格也相对温柔,他还在节目中说了不少金句。
编后语:喜欢于正风格的网友表示,他首次亮相《非诚勿扰》不招人讨厌,而且还让人很有眼缘。还有网友直言,于正的的点评亲切、真诚,而且很温暖,相比之下,乐嘉的点评会让人有些不舒服。