2011-06-18 34 views
2

我有一个问题,这与question有关,这是大约一年前@mnish提出的问题。Android本地服务示例,bindservice()和ServiceConnection()

请看看他的问题和代码。他实现了一个ServiceConnection()并将其传递给bindService()。这遵循顶部附近的Service文档中的本地服务示例。

我想实施本地服务示例,所以我想从@mnish问题/答案中添加一些细节。在ServiceConnection()@mnish有这行让我困惑:

mService = ILocService.Stub.asInterface(iservice); 

我明白@mnish写了这个代码,但没有任何人有任何想法ILocService是,我怎么可能去创造我自己的ILocService什么想法?这个结构在哪里被记录下来,我需要它吗? IBinder的价值是从哪里来的?

回答

4

他很可能使用的是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会传递实现onServiceConnected方法的ServiceConnection。

当您的服务实现为本地时,您不需要“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; 
     } 
    } 

    ... 

} 

这在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(); 
    } 
}; 
+0

谢谢我会给它一个镜头。但正如我上面提到的那样,有一个[Local Service Sample](http://developer.android.com/reference/android/app/Service.html#LocalServiceSample)将ServiceConnection()和IBinder传递给bindService()和我不认为它使用AIDL。也许@mnish正在使用AIDL,正如你所说,存根的原因。 – Marie

+0

添加样品做魔术的部分 – Tosa

+0

对不起,我不明白。你补充了什么?本地服务示例的LocalBinder?不,已经有了。 mBoundService?没有了。对不起,因为太钝了,但我不明白你的意思“添加了样本做魔术的部分。”你有没有编辑你的答案,我只是没有看到它? – Marie

1

给你,我的例子..会让你清楚关于那大声笑

// 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); 
    } 
} 
+0

如果服务没有运行并且您还没有启动它会怎么样?你有哪些检查? – TheRealChx101

相关问题