Deepesh mhatre Ответов: 0

Как использовать resultreceiver с запущенным сервисом в android .


Я создал класс resultreceiver,передал его с помощью intent в службу и реализовал функцию send() в службе, чтобы передать пакет в действие.

Я думаю, что я следовал правильным шагам, я также реализовал метод runonUithread() в методе onresultReceive ().


Цель проста: когда пользователь нажимает на кнопку , служба запускается, а затем жестко закодированные строковые данные передаются в действие для обновления текстового представления.

Проблема : когда я нажимаю на кнопку, ничего не происходит. В logcat нет выходных данных, а также нет изменений в textview. Наверное, я что-то пропустил в коде, но понятия не имею, что именно.

передавая весь мой код здесь :

-----------------------------------------------------------
activity_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textview1"
        android:layout_width="0dp"
        android:layout_height="1dp"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="216dp"
        android:onClick="StartService"
        android:text="Click"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>
----------------------------------------------

MainActivity.java :
package com.deepesh.startedserviceapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    public static final String MESSAGE_KEY="message_key";
    public static final String RECEIVER_TAG = "RECEIVER_TAG";

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

    public void setTextviewtext(String s ){
        TextView textView = findViewById(R.id.textview1);
        textView.setText(s);
    }


    public void StartService(View view) {

        ResultReceiver receiver = new MyResultReceiver(null);
        Intent intent = new Intent(MainActivity.this,started_service.class);
        intent.putExtra(MainActivity.RECEIVER_TAG,receiver);

        startService(intent);
    }


    class MyResultReceiver extends ResultReceiver{

        public MyResultReceiver(Handler handler) {
            super(handler);
        }


        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            super.onReceiveResult(resultCode,resultData);

           if (resultData !=null){

              final String data = resultData.getString(MainActivity.MESSAGE_KEY);

               MainActivity.this.runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       setTextviewtext(data);
                   }
               });

           }
        }

    }


}
---------------------------------------------------------

started_service.java :
package com.deepesh.startedserviceapp;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.os.ResultReceiver;


public class started_service extends Service {

    public started_service() {
    }

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

        ResultReceiver receiver = intent.getParcelableExtra(MainActivity.RECEIVER_TAG);

        Bundle bundle = new Bundle();
        bundle.putString(MainActivity.MESSAGE_KEY,"Hello World !");

        receiver.send(MainActivity.RESULT_OK,bundle);

        return Service.START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

}


Что я уже пробовал:

Я попытался поискать в google, но там нет никакого недавнего обновленного ответа на эту проблему.

Garth J Lancaster

Ну, вы изложили намерение, показали некоторый код, но вы на самом деле не описали "что происходит" - вы получаете ошибку, исключение или код даже не компилируется ? . это может быть хорошей идеей для использования Улучшить вопрос и скажите, в чем собственно заключается проблема.

[no name]

Готово, добавил он

David Crow

- В логкэте нет выходных данных..."

Может быть, потому, что нет никаких звонков ни в один из Log методы.

Ты пропал без вести try/catch блоки нарочно?

0 Ответов