Android 为什么在主活动关闭时远程服务被破坏?
我写了一个android程序,它有一个主要的UI活动,并启动一个服务。该服务及时回调UI活动以更新视图。它工作正常,除了:如果活动关闭(带BACK)并再次启动,服务也将再次启动(服务播放音频文件,因此有两个重叠的声音)。 我使用bindService和BIND_AUTO_CREATE标志启动并连接到服务。根据文档,只有当服务不存在时,它才应该创建服务,但很明显,它在第二次打开时会启动另一个实例。 我想要的只是当活动关闭时,服务继续运行,当活动再次打开时,它可以重新连接到服务。可能吗?或者我只是误解了服务的使用 尝试了更多: 在bindService意图中使用ICountService(如.aidl中所述)而不是CountService。当活动关闭时,调用onDestroyed 下面是创建服务的代码(如果有帮助)Android 为什么在主活动关闭时远程服务被破坏?,android,service,Android,Service,我写了一个android程序,它有一个主要的UI活动,并启动一个服务。该服务及时回调UI活动以更新视图。它工作正常,除了:如果活动关闭(带BACK)并再次启动,服务也将再次启动(服务播放音频文件,因此有两个重叠的声音)。 我使用bindService和BIND_AUTO_CREATE标志启动并连接到服务。根据文档,只有当服务不存在时,它才应该创建服务,但很明显,它在第二次打开时会启动另一个实例。 我想要的只是当活动关闭时,服务继续运行,当活动再次打开时,它可以重新连接到服务。可能吗?或者我只是误
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);
}
根据文档,只有当服务不存在时,它才应该创建服务,但很明显,它在第二次打开时会启动另一个实例
bindService()
将在服务未运行时创建服务实例<如果没有其他绑定连接且没有人调用startService()
,则code>unbindService()将销毁服务实例。如果服务在unbindService()
上被销毁,则后续的bindService()
将创建一个新的服务实例
理想情况下,unbindService()
不会立即破坏该服务,而是先让它停留几秒钟,以防在unbindService()之后不久出现bindService()
。然而,他们并不是这样实施的
我想要的只是当活动关闭时,服务继续运行,当活动再次打开时,它可以重新连接到服务
您应该使用startService()
和stopService()
而不是(或者可以想象是除了)bindService()
和unbindService()
这对我来说很有用
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);
}
}
谢谢启动/停止服务不工作。我尝试了更多,发现当活动关闭时(调用CountService.onDestroy),服务实际上被破坏。现在的问题是:如何防止服务被破坏?@Reno:UsestartService()
。信不信由你,它确实有用。谢谢。它终于开始工作了。现在我这样使用:当启动活动时,1)启动服务,2)不带BIND_AUTO_CREATE的bindService;当停止活动时,只需取消绑定服务,任何停止服务都不应添加一些解释,以使答案更有帮助。