我有一个广播用户当前位置的简单服务,我想使用绑定机制来控制服务的生命周期,但是服务就是没有启动。
我做错了什么?
public class GPSActivity extends ListActivity {
...
protected void onResume() {
super.onResume();
Log.i("Service", "Service bound");
Intent intent = new Intent(this, LocationService.class);
bindService(intent, service_connection , Context.BIND_AUTO_CREATE);
}
protected void onPause() {
if (dataUpdateReceiver!=null)
unregisterReceiver(dataUpdateReceiver);
unbindService(service_connection);
super.onPause();
}
class LocationServiceConnection implements ServiceConnection{
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("Service", "Service Connected");
}
public void onServiceDisconnected(ComponentName name) {
}
}
}
LocalBinder.java
public class LocalBinder<S> extends Binder {
private String TAG = "LocalBinder";
private WeakReference<S> mService;
public LocalBinder(S service){
mService = new WeakReference<S>(service);
}
public S getService() {
return mService.get();
}
}
LocationService.java
public class LocationService extends Service {
public void onCreate() {
initLocationListener();
Log.i("Location Service","onCreate()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("Location Service", "Received start id " + startId + ": " + intent);
return START_NOT_STICKY;
}
private final IBinder mBinder = new LocalBinder<LocationService>(this);
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
AndroidManifest.xml
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
...
<service android:name=".LocationService">
</service>
</application>
**编辑:**由于NickT的回答,已修复。
清单条目没有Intent筛选器或正确的名称
<service
android:enabled="true"
android:name="com.android.gps.services.LocationService">
<intent-filter>
<action android:name="com.android.gps.services.LocationService" />
</intent-filter>
</service>
我用于绑定的Intent类似于您在启动Activity时需要使用的Intent。正确的Intent是:
Intent intent = new Intent("com.android.gps.services.LocationService");
4条答案
按热度按时间5gfr0r5j1#
onStartCommand仅在显式启动服务时执行,看起来您只是想绑定到它,这很好。不过我看不出你已经正确地设置了服务连接。我正在发布我的存根程序,它展示了如何绑定到一个服务并通过绑定器调用服务中的一个方法。你可能想运行这个程序并查看各种日志消息的顺序。显然,您需要添加BroadcastReceiver和onLocationChaged代码,使其对您有用。
活动
服务
宣言
希望这能帮上忙
hsvhsicv2#
我让我的
Activity
实现了ServiceConnection
,并像这样绑定:然后在
Activity
中处理onServiceConnected()
和onServiceDisconnected()
的回调hfwmuf9z3#
调用
bindService
时,可能会出现以下错误:ActivityManager java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.android.server.am.ActivityRecord$Token
检查logcat的输出。
这是Android的一个bug。
要解决此问题,请使用
getApplicationContext().bindService(...)
goucqfw64#
我遇到的一个问题是,我在服务清单中设置了
android:enabled="false"
,这意味着您的应用也无法绑定,而是:根据文件:
服务是否可以由系统示例化-如果可以,则为“true”,否则为“false”。默认值为“true”。
我犯了一个错误,认为我的应用程序正在进行示例化,而不是系统。