Android通过活动控制服务
对于聊天应用程序,我需要管理用户和web服务之间通信的服务。我决定使用常用的Android服务组件 我现在知道如何启动服务,也知道如何将消息从服务发送到活动,但是如何从活动控制服务?Android通过活动控制服务,android,service,Android,Service,对于聊天应用程序,我需要管理用户和web服务之间通信的服务。我决定使用常用的Android服务组件 我现在知道如何启动服务,也知道如何将消息从服务发送到活动,但是如何从活动控制服务? 例如,用户发送消息,因此我必须让服务发送包含该消息的http请求。或者用户想要结束聊天会话,因此活动必须使服务发送一个包含结束聊天会话命令的请求。您可以使用AIDL 在AIDL中,您可以在服务中实现方法,并通过绑定器从活动中调用这些方法 因此,在您的情况下,1)在服务中实现sendMessage(stringms
例如,用户发送消息,因此我必须让服务发送包含该消息的http请求。或者用户想要结束聊天会话,因此活动必须使服务发送一个包含结束聊天会话命令的请求。您可以使用
AIDL
在AIDL中,您可以在服务中实现方法,并通过绑定器从活动中调用这些方法
因此,在您的情况下,1)在服务中实现sendMessage(stringmsg)
2) 在aidl文件中声明此方法并从服务调用
mService.sendMessage(msg);
不使用AIDL进行编辑:
服务等级
public class LocalService extends Service {
private final IBinder mBinder = new LocalBinder();
private final Random mGenerator = new Random();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return mBinder;
}
public class LocalBinder extends Binder{
LocalService getService(){
return LocalService.this;
}
}
public int getRandomNumber()
{
return mGenerator.nextInt(100);
}
}
活动课
public class BindingActivity extends Activity {
LocalService mService;
boolean mbound = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_binding);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_binding, menu);
return true;
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Intent intent = new Intent(this, LocalService.class);
bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
if(mbound)
{
unbindService(mConnection);
mbound = false;
}
}
private ServiceConnection mConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
LocalBinder binder = (LocalBinder)service;
mService = binder.getService();
mbound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mbound = false;
}
};
public void onClick(View view)
{
if(mbound)
{
int num = mService.getRandomNumber();
Toast.makeText(this, "number: "+num, Toast.LENGTH_SHORT).show();
}
}
}
您可以使用
AIDL
在AIDL中,您可以在服务中实现方法,并通过绑定器从活动中调用这些方法
因此,在您的情况下,1)在服务中实现sendMessage(stringmsg)
2) 在aidl文件中声明此方法并从服务调用
mService.sendMessage(msg);
不使用AIDL进行编辑:
服务等级
public class LocalService extends Service {
private final IBinder mBinder = new LocalBinder();
private final Random mGenerator = new Random();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return mBinder;
}
public class LocalBinder extends Binder{
LocalService getService(){
return LocalService.this;
}
}
public int getRandomNumber()
{
return mGenerator.nextInt(100);
}
}
活动课
public class BindingActivity extends Activity {
LocalService mService;
boolean mbound = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_binding);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_binding, menu);
return true;
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Intent intent = new Intent(this, LocalService.class);
bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
if(mbound)
{
unbindService(mConnection);
mbound = false;
}
}
private ServiceConnection mConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
LocalBinder binder = (LocalBinder)service;
mService = binder.getService();
mbound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mbound = false;
}
};
public void onClick(View view)
{
if(mbound)
{
int num = mService.getRandomNumber();
Toast.makeText(this, "number: "+num, Toast.LENGTH_SHORT).show();
}
}
}
Thx我会检查这一点,但AIDL我用于进程间通信,该服务将在与主线程相同的进程中运行。如果它们在同一进程中运行,那么希望有一种更轻量级的方法,那么不需要使用AIDL,只需通过扩展服务创建一个服务,并实现其方法和来自mService等活动的调用。sendMessage(msg)检查我编辑的答案,我相信这就是你要找的好的,看起来很好,很简单,我会试试这个,比如我调用
mService.sendMessage()
并在sendMessage中进行httprequest。然后我得到一个exceptionOnMainThread错误,但是服务应该在它自己的线程中运行,所以直接调用服务方法可能不是正确的方法?!我想知道为什么与intentservicesThx交互没有什么相似之处,我会检查这一点,但我使用AIDL进行进程间通信,该服务将在与主线程相同的进程中运行。如果它们在同一进程中运行,那么希望有一种更轻量级的方法,那么不需要使用AIDL,只需通过扩展服务创建一个服务,并实现其方法和来自mService等活动的调用。sendMessage(msg)检查我编辑的答案,我相信这就是你要找的好的,看起来很好,很简单,我会试试这个,比如我调用mService.sendMessage()
并在sendMessage中进行httprequest。然后我得到一个exceptionOnMainThread错误,但是服务应该在它自己的线程中运行,所以直接调用服务方法可能不是正确的方法?!我想知道为什么没有什么比与IntentService交互更相似的了