我写了一个android程序:有一个UI的主要活动,它启动一个服务。该服务及时回调UI活动以更新视图。它工作正常,除了:如果活动关闭(使用BACK)并再次启动,服务也将再次启动(服务播放音频文件,因此有两个重叠的声音)。 我使用带有BIND_AUTO_CREATE标志的bindService来启动并连接到服务。根据该文档,它应该只在它不存在时创建服务,但显然它在第二次打开时启动另一个实例。 我想要的只是当活动关闭,服务继续运行,当活动再次打开时,它可以重新连接到服务。那可能吗?或者我只是误解了服务的使用?
尝试更多: 在bindService Intent中使用ICountService(在.aidl中描述)而不是CountService。当活动关闭时,会调用onDestroyed。
以下是有用的服务代码。
ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName c, IBinder b) {
Log.d("TK","Connected");
//binder = (ICountService.Stub) b;
service = ICountService.Stub.asInterface(b);
try {
service.setCallback(new ICountCallback.Stub(){
@Override
public void alert() {
Log.d("TK","alert!");
}
@Override
public void updateTime(final int sec) {
handler.post(new Runnable(){
@Override
public void run() {
indicator.setText(toText(sec));
}
});
}
});
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName c) {
Log.d("TK","Disconnected");
}
};
private void startCountService(){
Intent i = new Intent(ICountService.class.getName());
boolean ok = context.bindService(i, conn, Context.BIND_AUTO_CREATE);
Log.d("TK", "bindService="+ok);
}
答案 0 :(得分:7)
如果服务未运行,根据该文档,它应该只在它不存在时创建服务,但显然它在第二次打开时启动另一个实例。
bindService()
将创建服务实例。如果没有其他绑定连接且没有人调用unbindService()
,startService()
将销毁服务实例。如果服务在unbindService()
上销毁,则后续的bindService()
将创建新的服务实例。
恕我直言,理想情况下,unbindService()
不会立即销毁该服务,但如果bindService()
之后不久有unbindService()
,请先让它停留几秒钟。但是,这并不是他们实施的方式。
我想要的只是当活动关闭,服务继续运行,当活动再次打开时,它可以重新连接到服务。
您应该使用startService()
和stopService()
代替(或可能除此之外)bindService()
和unbindService()
。
答案 1 :(得分:-2)
这对我有用。
Main.java
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startService(new Intent(Main.this, MyService.class));
try{
MyService.setMainActivity(this);
}catch(Exception e){
//t.setText(e.getMessage());
}
}
}
MyService.java
public class MyService extends Service {
private Context ctx;
public static Main main;
@Override public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void onCreate()
{
super.onCreate();
ctx = this;
startService();
}
@Override public void onDestroy() {
// TODO Auto-generated method stub
Log.d("ASAS","Destroy");
super.onDestroy();
}
public static void setMainActivity(Main activity) {
main = activity;
}
private void startService()
{
//timer.scheduleAtFixedRate(new checkdata(),0,30000);
}
}