嗨:我似乎无法将活动绑定到同一个包中的服务。
活动如下:
public class myApp extends TabActivity {
static private String TAG = "myApp";
private myService mService = null;
private ServiceConnection mServiceConn = new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder service) {
Log.v(TAG, "Service: " + name + " connected");
mService = ((myService.myBinder)service).getService();
}
public void onServiceDisconnected(ComponentName name) {
Log.v(TAG, "Service: " + name + " disconnected");
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
doBind();
Log.i(TAG, "Started (UI Thread)");
// set content
setContentView(R.layout.main);
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
... add some tabs here....
tabHost.setCurrentTab(0);
}
private void doBind(){
Intent i = new Intent(this,myService.class);
if( bindService(i, mServiceConn, 0 )){
Log.i(TAG, "Service bound");
} else {
Log.e(TAG, "Service not bound");
}
}
}
然后服务:
public class myService extends Service {
private String TAG = "myService";
private boolean mRunning = false;
@Override
public int onStartCommand(Intent intent, int flags, int startid) {
Log.i(TAG,"Service start");
mRunning = true;
Log.d(TAG,"Finished onStartCommand");
return START_STICKY;
}
/*
* Called on service stop
*/
@Override
public void onDestroy(){
Log.i(TAG,"onDestroy");
mRunning = false;
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
boolean isRunning() {
return mRunning;
}
/*
* class for binding
*/
private final IBinder mBinder = new myBinder();
public class myBinder extends Binder {
myService getService() {
return myService.this;
}
}
}
bindService返回true,但是从不调用onServiceConnection(mService总是为null,所以我不能做像mService.isRunning()这样的事情)
该服务的清单条目只是:
<service android:name=".myService"></service>
我是直接从Android开发者网站复制代码,但我一定错过了一些东西。
答案 0 :(得分:25)
一个已知的问题是,活动开始时作为tabactivity中的子活动(在tabhost中运行)无法绑定到服务,即使在同一个包中也是如此。有一个“黑客”的解决方法。如果你打电话:
getApplicationContext().bindService(Intent, connection, flags);
而不仅仅是:
bindService(Intent, connection, flags);
一切都会奏效。遇到同样的问题,在这个bug报告中找到了详细信息:
http://code.google.com/p/android/issues/detail?id=2483
答案 1 :(得分:3)
您的服务从未启动过。启动服务
startService(bindIntent)
请参阅此类似代码:
Intent bindIntent = new Intent(this,ServiceTask.class);
if (ServiceTools.isServiceRunning() == false){
Log.d(Global.TAG,"-->service will be started.");
startService(bindIntent);
}else{
Log.d(Global.TAG,"-->service already is running");
}
boolean bound = bindService(bindIntent,mConnection,0);
您还可以在使用BIND_AUTO_CREATE而不是0绑定时自动启动服务。
如果您只希望自己的服务启动一次,那么这也是ServiceTools类。否则,您可能会获得多个正在运行的服务实例,并且每次onCreate()/ doBind()都会在onServiceConnected中调用的方法都会出现问题。
public class ServiceTools {
public static boolean isServiceRunning(){
final ActivityManager activityManager = (ActivityManager)Global.gContext.getSystemService(Global.gContext.ACTIVITY_SERVICE);
final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
boolean isServiceFound = false;
for (int i = 0; i < services.size(); i++) {
//Log.d(Global.TAG, "Service" + i + " :" + services.get(i).service);
//Log.d(Global.TAG, "Service" + i + " package name : " + services.get(i).service.getPackageName());
//Log.d(Global.TAG, "Service" + i + " class name : " + services.get(i).service.getClassName());
if ("com.atClass.lmt".equals(services.get(i).service.getPackageName())){
if ("com.atClass.lmt.ServiceTask".equals(services.get(i).service.getClassName())){
isServiceFound = true;
}
}
}
return isServiceFound;
}
}