Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android通过活动控制服务_Android_Service - Fatal编程技术网

Android通过活动控制服务

Android通过活动控制服务,android,service,Android,Service,对于聊天应用程序,我需要管理用户和web服务之间通信的服务。我决定使用常用的Android服务组件 我现在知道如何启动服务,也知道如何将消息从服务发送到活动,但是如何从活动控制服务? 例如,用户发送消息,因此我必须让服务发送包含该消息的http请求。或者用户想要结束聊天会话,因此活动必须使服务发送一个包含结束聊天会话命令的请求。您可以使用AIDL 在AIDL中,您可以在服务中实现方法,并通过绑定器从活动中调用这些方法 因此,在您的情况下,1)在服务中实现sendMessage(stringms

对于聊天应用程序,我需要管理用户和web服务之间通信的服务。我决定使用常用的Android服务组件

我现在知道如何启动服务,也知道如何将消息从服务发送到活动,但是如何从活动控制服务?
例如,用户发送消息,因此我必须让服务发送包含该消息的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交互更相似的了