Образец локальной службы Android, bindservice () и ServiceConnection () - PullRequest
3 голосов
/ 19 июня 2011

У меня есть вопрос, связанный с этим вопросом , который был задан @mnish около года назад.

Пожалуйста, посмотрите на его вопрос и код. Он реализует ServiceConnection () и передает его в bindService (). Это следует примеру локальной службы в документации Service вверху.

Я хочу реализовать пример локальной службы, поэтому я пытаюсь добавить некоторые подробности из @mnish вопрос / ответ. В ServiceConnection () @mnish есть эта строка, которая меня смущает:

mService = ILocService.Stub.asInterface(iservice);

Я понимаю, что @mnish написал этот код, но кто-нибудь знает, что такое ILocService и как я могу создать свой собственный ILocService? Где эта конструкция задокументирована и нужна ли она мне? Кроме того, откуда берется значение для IBinder iservice?

Ответы [ 2 ]

5 голосов
/ 19 июня 2011

Он, вероятно, использует язык определения интерфейса Android (AIDL) http://developer.android.com/guide/components/aidl.html

Поэтому он должен использовать заглушку серверной реализации, как описано в документации:

 // This is called when the connection with the service has been
 // established, giving us the service object we can use to
 // interact with the service.  We are communicating with our
 // service through an IDL interface, so get a client-side
 // representation of that from the raw service object.
 mService = IRemoteService.Stub.asInterface(service);

Ссылка iservice исходит из метода onServiceConnected, который вызывается после привязки службы к вашей деятельности. Вызов bindService получает ServiceConnection, который реализует метод onServiceConnected.

Вам не нужен «IRemoteService.Stub.asInterface (service)», когда ваша реализация службы локальна, тогда вы можете просто привести службу к вашей локальной службе.

Пример локального сервиса делает это в сервисе:

public class LocalService extends Service {
    private NotificationManager mNM;

    // Unique Identification Number for the Notification.
    // We use it on Notification start, and to cancel it.
    private int NOTIFICATION = R.string.local_service_started;

    /**
     * Class for clients to access.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with
     * IPC.
     */
    public class LocalBinder extends Binder {
        LocalService getService() {
        return LocalService.this;
        }
    }

    ...

}

И это в Activity в классе ServiceConnection:

private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
        // This is called when the connection with the service has been
        // established, giving us the service object we can use to
        // interact with the service.  Because we have bound to a explicit
        // service that we know is running in our own process, we can
        // cast its IBinder to a concrete class and directly access it.
        mBoundService = ((LocalService.LocalBinder)service).getService();

        // Tell the user about this for our demo.
        Toast.makeText(Binding.this, R.string.local_service_connected,
                Toast.LENGTH_SHORT).show();
    }

    public void onServiceDisconnected(ComponentName className) {
        // This is called when the connection with the service has been
        // unexpectedly disconnected -- that is, its process crashed.
        // Because it is running in our same process, we should never
        // see this happen.
        mBoundService = null;
        Toast.makeText(Binding.this, R.string.local_service_disconnected,
            Toast.LENGTH_SHORT).show();
    }
};
2 голосов
/ 05 ноября 2011

Вот вы, мой пример .. разъясню вам об этом LOL

// My MyServiceInterface.aidl
package com.mad.exam;

interface MyServiceInterface {
     int getNumber();
}

//MyService 
public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "Service OnBind()", Toast.LENGTH_LONG).show();
        return mBinder;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Toast.makeText(this, "Service Created", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Toast.makeText(this, "Service Destroyed ", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        Toast.makeText(this, "Service Started ", Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        // TODO Auto-generated method stub
        return super.onUnbind(intent);
    }

    private final MyServiceInterface.Stub mBinder = new MyServiceInterface.Stub() {
        public int getNumber() {
            return new Random().nextInt(100);
        }
    };
}

//My Activity 
public class ServiceDemo extends Activity implements OnClickListener {
    MyServiceInterface mService;
    ServiceConnection mConnection;
    Button retreive;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.service);
        retreive = (Button) findViewById(R.id.retreive);
        retreive.setOnClickListener(this);

        mConnection = new ServiceConnection() {

            public void onServiceDisconnected(ComponentName name) {
                // TODO Auto-generated method stub
            }

            public void onServiceConnected(ComponentName name, IBinder service) {
                // TODO Auto-generated method stub
                mService = MyServiceInterface.Stub.asInterface(service);

                try {
                    int i;
                    i = mService.getNumber();
                    Toast.makeText(ServiceDemo.this, "The service value is: " + String.valueOf(i), Toast.LENGTH_SHORT).show();
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        Log.i("My Tag", "Clicked");
        Button btn = (Button) v;
        Intent callService = new Intent(this, MyService.class);
        bindService(callService, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        Intent callService = new Intent(this, MyService.class);
        bindService(callService, mConnection, Context.BIND_AUTO_CREATE);
    }
}
...