활동과 서비스 간의 의사소통. 서비스에서 활동으로의 데이터 전송을 구성하는 방법은 무엇입니까? 복잡한 객체 전송

안녕하세요.

UART를 통해 수신된 데이터를 Activity로 전송해야 합니다. 이는 활동에서 while 루프(!isInterrupted())를 구성하고 UART 버퍼에서 데이터를 읽는 스레드를 생성하여 수행할 수 있습니다. 그런 다음 UI 스레드 Activity - MainActivity.this.runOnUiThread(new Runnable() )를 호출하여 이 Activity로 필요한 작업을 수행합니다. 그러나 기본 Activity에서 다른 Activity를 호출하면 구성된 스레드는 데이터 전달을 허용하지 않습니다. 내가 올바르게 이해한 경우 스트림의 데이터를 활동으로 전송하려면 스트림이 활동이 아닌 서비스에서 생성되어야 합니다.

질문: 데이터가 UART를 통해 도착했습니다. 스트림(Servce에서 생성됨)에서 현재 활성화된 활동으로 데이터를 전송해야 합니다. 이 작업을 어떻게 수행할 수 있으며 실제로 수행됩니까?

답변 1개

각 활동에서 핸들러를 생성합니다. 이 Activity의 onResume() 메서드에서 BindService()가 수행됩니다. 매개변수 중 하나는 ServiceConnection 인터페이스입니다. 최소한 동일한 활동으로 구현하십시오. onServiceConnected() 메소드를 구현하십시오. 이 콜백에서 매개변수 중 하나는 서비스 자체입니다. 따라서 이 서비스의 자체 setHandler() 메서드를 호출하세요. 현재 활동에 있는 핸들러를 전달합니다. 하지만 UART를 통해 들어오는 데이터를 이 핸들러의 서비스로 보냅니다. 그런데 Handler는 전통적으로 메인 스레드에서 실행되므로 OnUiThread를 실행할 필요가 없습니다.

마지막 업데이트: 2018년 4월 3일

Intent 객체는 두 활동 간에 데이터를 전송하는 데 사용됩니다. putExtra() 메소드를 통해 키와 관련 값을 추가할 수 있습니다.

예를 들어 현재 활동에서 "hello" 키를 사용하여 "Hello World" 문자열을 SecondActivity에 전달합니다.

// SecondActivity를 실행하기 위한 Intent 객체 생성 Intentint = new Intent(this, SecondActivity.class); // 키가 "hello"이고 값이 "Hello World"인 객체 전달 의도.putExtra("hello", "Hello World"); // SecondActivity 시작 startActivity(의도);

데이터를 전송하기 위해 가장 간단한 유형의 데이터를 값(String, int, float, double, long, short, byte, char, 이러한 유형의 배열 또는 직렬화 가능)으로 전송할 수 있는 putExtra() 메소드가 사용됩니다. 인터페이스 객체.

SecondActivity를 로드할 때 전송된 데이터를 얻으려면 객체 키가 전달되는 get() 메서드를 사용할 수 있습니다.

번들 인수 = getIntent().getExtras(); 문자열 이름 = 인수.get("hello").toString(); // 안녕하세요 세계

보내는 데이터의 유형에 따라, 이를 수신할 때 Bundle 객체에 대해 여러 가지 메서드를 사용할 수 있습니다. 이들 모두는 객체 키를 매개변수로 사용합니다. 주요 내용:

    get() : Object 유형의 값을 반환하는 일반 메서드입니다. 따라서 이 값의 수신 필드를 원하는 유형으로 변환해야 합니다.

    getString() : String 객체를 반환합니다.

    getInt() : int 값을 반환합니다.

    getByte() : 바이트 값을 반환합니다.

    getChar() : char 값을 반환합니다.

    getShort() : short 유형의 값을 반환합니다.

    getLong() : 긴 값을 반환합니다.

    getFloat() : 부동 소수점 값을 반환합니다.

    getDouble() : double을 반환합니다.

    getBoolean() : 부울 값을 반환합니다.

    getCharArray() : char 객체의 배열을 반환합니다.

    getIntArray() : int 객체의 배열을 반환합니다.

    getFloatArray() : float 객체의 배열을 반환합니다.

    getSerialized() : 직렬화 가능 인터페이스 객체를 반환합니다.

프로젝트에 MainActivity와 SecondActivity라는 두 가지 활동이 정의되어 있습니다.

SecondActivity 코드에서는 수신 데이터를 정의합니다.

패키지 com.example.eugene.serializeapp; android.support.v7.app.AppCompatActivity 가져오기; import android.os.Bundle; import android.widget.TextView; 공개 클래스 SecondActivity는 AppCompatActivity를 확장합니다( @Override protected void onCreate(Bundle saveInstanceState)( super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setTextSize(20); textView.setPadding(16, 16, 16, 16) ); 번들 인수 = getIntent().getExtras(); if(arguments!=null)( 문자열 이름 = 인수.get("name").toString(); 문자열 회사 = 인수.getString("회사"); int 가격 = 인수.getInt("가격"); textView.setText("이름: " + 이름 + "\n회사: " + 회사 + "\n가격: " + 가격 ) setContentView(textView) )

이 경우 SecondActivity에서는 Bundle 개체에서 모든 데이터를 가져와 TextView 텍스트 필드에 표시합니다. 이 활동에는 세 가지 요소, 즉 키 이름과 회사가 포함된 두 개의 문자열과 키 가격이 포함된 숫자가 전달된다고 가정합니다.

이제 SecondActivity로의 데이터 전송을 정의해 보겠습니다. 예를 들어, Activity_main.xml 파일에서 MainActivity에 대해 다음 인터페이스를 정의해 보겠습니다.