wake-up-neo.com

Verwenden von ResultReceiver in Android

Grundsätzlich möchte ich einen Rückruf zu einer Aktivität von einem IntentService einrichten. Meine Frage ist der hier beantworteten sehr ähnlich:

Restful API Service

Im Antwortcode wird der Aktivitätscode jedoch als Implementierung eines ResultReceiver angesehen. Sofern mir nichts fehlt, ist ResultReceiver tatsächlich eine Klasse, sodass diese Implementierung nicht durchgeführt werden kann.

Im Wesentlichen frage ich mich also, wie ein ResultReceiver korrekt an diesen Service angeschlossen werden kann. Ich verwechsle diesbezüglich die Konzepte von Handler und ResultReceiver. Jeder funktionierende Beispielcode wird gebeten.

59
Bill Eisenhauer
  1. Sie müssen die benutzerdefinierte resultreceiver-Klasse von ResultReceiver aus erweitern

  2. implementiert dann die resultreceiver-Schnittstelle in Ihre Aktivität

  3. Übergeben Sie ein benutzerdefiniertes resultreceiver-Objekt an intentService, und rufen Sie in intentservice einfach das Empfängerobjekt ab und die Funktion receiver.send () auf, um etwas an die aufrufende Aktivität im Bundle-Objekt zu senden.

    hier ist die customResultReceiver-Klasse:

     public class MyResultReceiver extends ResultReceiver {
    
        private Receiver mReceiver;
    
        public MyResultReceiver(Handler handler) {
            super(handler);
            // TODO Auto-generated constructor stub
        }
    
        public interface Receiver {
            public void onReceiveResult(int resultCode, Bundle resultData);
    
        }
    
        public void setReceiver(Receiver receiver) {
            mReceiver = receiver;
        }
    
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
    
            if (mReceiver != null) {
                mReceiver.onReceiveResult(resultCode, resultData);
            }
        }
    
    }
    

implementiert die Myresultreceiver.receiver-Schnittstelle in Ihrer Aktivität, erstellen Sie eine Klassenvariable

Public MyResultReceiver mReceiver;

initialisieren Sie diese Variable in onCreate:

mReceiver = new MyResultReceiver(new Handler());

mReceiver.setReceiver(this);

Übergeben Sie diesen mReceiver an den intentService über:

intent.putExtra("receiverTag", mReceiver);

und in IntentService holen wie:

ResultReceiver rec = intent.getParcelableExtra("receiverTag");

und sende alles an die Aktivität mit rec als:

Bundle b=new Bundle();
rec.send(0, b);

dies wird in onReceiveResult der Aktivität empfangen. Sie können den vollständigen Code unter folgender Adresse anzeigen: IntentService: Zurückgeben von Daten an Activity

Bearbeiten: Sie sollten setReceiver (this) in onResume und setReceiver (null) in onPause () aufrufen, um Lecks zu vermeiden.

116
SohailAziz

Sie überschreiben eine Methode durch Unterklassen. Es muss keine Schnittstelle sein, um das zu tun.

Beispielsweise:

intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (resultCode == StockService.RESULT_ID_QUOTE) {
            ...
        }
    }
});

Ich habe ein einfaches Beispiel erstellt, das die Verwendung von ResultReceiver demonstriert.

Hauptaktivität:

public class MainActivity extends AppCompatActivity {

    private final static String TAG = MainActivity.class.getSimpleName();

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

        Intent serviceIntent = new Intent(this, MyService.class);
        serviceIntent.putExtra("logName", "MAIN_ACTIVITY");
        serviceIntent.putExtra(MyService.BUNDLED_LISTENER, new ResultReceiver(new Handler()) {
            @Override
            protected void onReceiveResult(int resultCode, Bundle resultData) {
                super.onReceiveResult(resultCode, resultData);

                if (resultCode == Activity.RESULT_OK) {
                    String val = resultData.getString("value");
                    Log.i(TAG, "++++++++++++RESULT_OK+++++++++++ [" + val + "]");
                } else {
                    Log.i(TAG, "+++++++++++++RESULT_NOT_OK++++++++++++");
                }
            }
        });
        startService(serviceIntent);
    }
}

MyService:

public class MyService extends Service {

    private final static String TAG = MyService.class.getSimpleName();
    public final static String BUNDLED_LISTENER = "listener";

    @Override
    public void onCreate() {
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        String logName = intent.getStringExtra("logName");
        ResultReceiver receiver = intent.getParcelableExtra(MyService.BUNDLED_LISTENER);

        Bundle bundle = new Bundle();
        bundle.putString("value", "30");
        receiver.send(Activity.RESULT_OK, bundle);
        return Service.START_NOT_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}
10
user2121