如何正确地在启动服务后立即调用finish()方法

3

我希望在启动服务后立即退出应用程序。

以下代码会在启动服务之前结束活动。 如何设置监听器,在服务启动时提示我?

btn  = (ImageButton) findViewById(R.id.button );
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startService(new Intent(MainActivity.this, MyService.class));

                //I want to exit the activity here.
                finish(); // this exits the activity before the service is started

            }
        });

1
当服务类启动时,您可以在其中完成您的活动。 - Arjun saini
我相信上述代码应该可以正常工作。问题有点幼稚——服务在清单文件中注册了吗? - Shaishav
@Er.Arjunsaini,这就是诀窍!我从服务向活动发送了广播;然后当活动接收到广播时调用finish()。 - Angel Koh
3个回答

2
以下是我使用的代码,基于@Er.Arjunsaini的提议。
在ACTIVITY文件中,我注册监听“退出应用程序”广播。
private final BroadcastReceiver exitAppReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //activity exits when "exit app" broadcast received.
        finish();
    }
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //REGISTER TO LISTEN FOR THE BROADCAST
    LocalBroadcastManager.getInstance(this).
            registerReceiver(exitAppReceiver, new IntentFilter(getString(R.string.exit_app)));

    btn = (ImageButton) findViewById(R.id.my_button);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) { 
            startService( new Intent(this, MyService.class));

        }
    }); 
}

@Override
public void onDestroy() {

    //UNREGISTER THE RECEIVER
    LocalBroadcastManager.getInstance(this).
            unregisterReceiver(exitFloatingWindowReceiver);
    super.onDestroy();
}

在SERVICE文件中,我发送了一个“退出APP”广播。
@Override
public void onCreate() {
    super.onCreate();

    //... do the rest of the Service initializing 

    //CLOSE ACTIVITY
    LocalBroadcastManager.getInstance(this).
            sendBroadcast(new Intent(getString(R.string.exit_app)));
}

0

0
如果你使用`bindService()`而不是`startService()`,你可以在Activity和Service之间使用基于Message的通信系统。这在reference中有详细解释。本节末尾有示例类链接。

-MessengerService.java

-MessengerServiceActivities.java

这里有一个带有两个按钮的Activity示例,一个按钮用于启动Service,另一个按钮用于向Service发送消息,该消息将重新发送给Activity以关闭它。

MainActivity.java

package com.pasquapp.brodcasttest01;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.view.View;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

public final static int WHAT_CLOSE_ACTIVITY=1;

private Button startServiceButton;
private Button closeButton;
private Messenger activityMessenger;
private Messenger serviceMessenger;
private MyServiceConnection serviceConnection;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    activityMessenger =new Messenger(new ActivityHandler());
    initView();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if(serviceConnection!=null)
        unbindService(serviceConnection);
}

private void initView(){
    startServiceButton=findViewById(R.id.button_start_service);
    startServiceButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startService();
        }
    });
    closeButton=findViewById(R.id.button_close);
    closeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(serviceMessenger!=null){
                Message msg=Message.obtain();
                msg.replyTo=activityMessenger;
                msg.what=MyService.WHAT_CLOSE_ACTIVITY;
                try {
                    serviceMessenger.send(msg);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }
    });
}

private class MyServiceConnection implements ServiceConnection{
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        serviceMessenger=new Messenger(iBinder);
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        serviceMessenger=null;
    }
}

private void startService(){
    serviceConnection=new MyServiceConnection();
    bindService(new Intent(this,MyService.class),serviceConnection,BIND_AUTO_CREATE);
}

private class ActivityHandler extends Handler{
    @Override
    public void handleMessage(@NonNull Message msg) {
        int what=msg.what;
        switch (what){
            case WHAT_CLOSE_ACTIVITY:
                MainActivity.this.finish();
                break;
                default:
                    super.handleMessage(msg);
        }
    }
}}

MyService.java

package com.pasquapp.brodcasttest01;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;

import androidx.annotation.NonNull;

public class MyService extends Service {

    public static final int WHAT_CLOSE_ACTIVITY=1;

    private Messenger mMessenger;


    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mMessenger=new Messenger(new ServiceHandler());

    }

    @Override
    public IBinder onBind(Intent intent) {
        return mMessenger.getBinder();
    }

    private class ServiceHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            int what=msg.what;
            switch (what){
                case WHAT_CLOSE_ACTIVITY:
                    Messenger messenger=msg.replyTo;
                    Message closeMsg=Message.obtain();
                    closeMsg.what=MainActivity.WHAT_CLOSE_ACTIVITY;
                    try {
                        messenger.send(closeMsg);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    super.handleMessage(msg);
            }

        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接