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

时间:2016-08-20 06:11:38

标签: android android-service

我喜欢在启动服务后立即退出我的应用程序。

下面的代码会导致活动在服务启动之前完成。 如何设置一个监听器在服务启动时提示我?

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

            }
        });

3 个答案:

答案 0 :(得分:1)

以下是我使用的代码,基于@ 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)));
}

答案 1 :(得分:0)

结帐ServiceConnectiononServiceConnected可能是您正在寻找的方法finish()

HERE你有例子

答案 2 :(得分:0)

如果您使用bindService()而不是startService(),则可以在活动和服务之间使用基于Message的通信系统。 此reference中对此进行了说明。 在本节的末尾,有一个指向示例类的链接:

-MessengerService.java

-MessengerServiceActivities.java

这里有一个带有2个按钮的活动示例,一个用于启动服务,另一个用于向服务发送消息,该消息将向该活动重新发送消息以将其关闭。

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);
            }

        }
    }
}