Android에서 기본 활동으로 데이터 전송


295

주요 활동과 아동 활동이라는 두 가지 활동이 있습니다.
주 활동에서 버튼을 누르면 하위 활동이 시작됩니다.

이제 일부 데이터를 기본 화면으로 다시 보내려고합니다. 번들 클래스를 사용했지만 작동하지 않습니다. 런타임 예외가 발생합니다.

이에 대한 해결책이 있습니까?



또 하나의 트릭 주요 활동에서의 ArrayList를 정의하고 정적 당신이 다음 다음 주요 활동에 액세스 당신이 주요 활동으로 보낼 그거야에 데이터를 추가 번째 활동에 액세스 할 수 있도록 만들기
아비 쉑 야다 브

Abhishek Yadav, 주요 활동이 파괴 될 경우 어떻게됩니까 (onDestroy () 콜백). 나는 그것이 좋은 조언이 아니라고 생각합니다.
Leontsev Anton

답변:


472

상황에 따라 원하는 것을 달성하는 몇 가지 방법이 있습니다.

가장 일반적인 시나리오 (사운드처럼 들리는 방법)는 목록에서 연락처를 선택하거나 대화 상자에 데이터를 입력하는 등의 하위 활동을 사용하여 사용자 입력을 얻는 경우입니다. 이 경우 startActivityForResult자녀 활동을 시작 하는 데 사용해야 합니다.

이는를 사용하여 데이터를 기본 활동으로 다시 보내기위한 파이프 라인을 제공합니다 setResult. setResult 메소드는 int 결과 값과 Intent를 호출 활동으로 다시 전달합니다.

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

호출 활동 대체에서 리턴 된 데이터에 액세스하려면 onActivityResult. requestCode는 startActivityForResult호출에 전달 된 정수에 해당하는 반면 resultCode 및 data Intent는 하위 Activity에서 리턴됩니다.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}

4
완전성을 위해 finish ()를 호출하기에 가장 좋은 장소는 무엇입니까? 전문가에게는 분명하지만 초보자에게는 추가 소스를 참조하지 않고 알아야 할 것입니다.
Califf

1
@jelmoodjasser 알아내는 데 약간의 시간이 걸렸지 만 기본적으로 Intent로 새 활동을 시작하면 startActivityForResult그냥 대신 함수 를 사용해야합니다 startActivity. 예를 들어 startActivityForResult(myIntent, 2);2는 결과 코드이며 위의 MY_CHILD_ACTIVITYswitch 문에서 대신 할 수 있습니다 .
스포트라이트

두 번째 활동이 완료되고 첫 번째 활동으로 돌아간 후 requestCode를 완료하기 전에 두 번째 활동으로 설정하는 방법 .... FirstActivity의 onActivityResult에 사용하려면
Ahamadullah Saikat

의도는 필수입니까? 반품 할 내용이없는 경우 다시 보내려면 빈 의도가 필요합니까?
Bagus Aji Santoso

@BagusAjiSantoso 인 텐트는 선택 사항이며 다시 보낼 것이 있으면 필요합니다.
Narendra Singh

186

활동 1은 startActivityForResult를 사용합니다 .

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

활동 2가 시작되고 작업을 수행하여 활동을 닫을 수 있습니다.

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

활동 1-이전 활동에서 돌아 오면 onActivityResult 가 호출됩니다 .

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

업데이트 : Seenu69의 의견에 대한 답변, 활동 2에서,

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

그런 다음 활동 1에서

int result = data.getExtra(KEY_RESULT);

안녕 내 질문에 대답 해 주셔서 감사합니다.이 코드는 충분하지 않습니다. 두 번째 활동 자체에서 추가를 수행하고 결과를 onActivityResult 메소드를 통해 MainActivity로 리턴해야합니다. 예를 들어 메인 액티비티에는 버튼을 클릭 할 때 u에서 두 번째 액티비티로 이동하는 버튼 만 있으며 editText 위젯을 통해 두 개의 숫자가 입력되고 두 번째 액티비티 자체에서 추가 논리가 수행되고 결과는 MainActivity로 반환됩니다. 알았다?
Seenu69

2
이 경우 두 번째 액티비티에서는 계산을 수행하고 putExtra ()를 사용하여 결과를 의도에 저장합니다. 위의 답변을 수정했습니다.
jimmithy

68

데이터를 다시 보내기

상황에 맞는 것을 볼 수있게 도와줍니다. 다음은 데이터를 다시 보내기위한 완벽한 간단한 프로젝트입니다. xml 레이아웃 파일을 제공하는 대신 이미지가 있습니다.

여기에 이미지 설명을 입력하십시오

주요 활동

  • 로 두 번째 활동을 시작하여 startActivityForResult임의의 결과 코드를 제공하십시오.
  • 재정의 onActivityResult. 두 번째 활동이 완료되면 호출됩니다. 요청 코드를 확인하여 실제로 두 번째 활동인지 확인할 수 있습니다. (이것은 동일한 기본 활동에서 여러 다른 활동을 시작할 때 유용합니다.)
  • 당신이 반환에서 얻은 데이터를 추출합니다 Intent. 데이터는 키-값 쌍을 사용하여 추출됩니다.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // Get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // Set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

두 번째 활동

  • 이전 활동으로 다시 보내려는 데이터를에 넣습니다 Intent. 데이터는 Intent키-값 쌍을 사용하여 저장됩니다 .
  • 결과를 설정하고 RESULT_OK데이터를 보유하려는 의도를 추가하십시오.
  • finish()두 번째 활동을 마치려면 전화하십시오 .

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

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

    // "Send text back" button click
    public void onButtonClick(View view) {

        // Get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // Put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

기타 노트

  • 조각에 있다면의 의미를 알 수 없습니다 RESULT_OK. 이름 만 사용하십시오 Activity.RESULT_OK.

또한보십시오


그것은 아주 잘 쓰여진 설명입니다. 잘 했어!
Kingsley Ijike 1

29

FirstActivity는 startActivityForResult를 사용합니다.

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int requestCode); // suppose requestCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

SecondActivity 호출시 setResult () onClick 이벤트 또는 onBackPressed ()

Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);

requestCode의 resultCode입니까?
Engr Syed Rowshan Ali

15

startActivityForResult () 메소드 호출을 사용하여 하위 활동 의도를 호출하십시오.

여기에 예가 있습니다 : http://developer.android.com/training/notepad/notepad-ex2.html

및 "화면에서 결과 반환": http://developer.android.com/guide/faq/commontasks.html#opennewscreen


예, 나는 cbrulak과 동의합니다. 문서에 대한 링크는 답변보다 훨씬 도움이되었습니다.
george_h

링크는 현재 몇 가지 일반적인 사항을 보여줍니다. 내용이 변경 될 수 있습니다. 업데이트하거나 커뮤니티에 대한 답변을 제거하십시오
Manoranjan

7

더 나은 참조를 위해 간단한 데모 클래스를 만들었습니다.

FirstActivity.java

 public class FirstActivity extends AppCompatActivity {

    private static final String TAG = FirstActivity.class.getSimpleName();
    private static final int REQUEST_CODE = 101;
    private Button btnMoveToNextScreen;

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

        btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
        btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivityForResult(mIntent, REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE && data !=null) {
                String strMessage = data.getStringExtra("keyName");
                Log.i(TAG, "onActivityResult: message >>" + strMessage);
            }
        }

    }
}

그리고 여기 SecondActivity.java가 있습니다

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = SecondActivity.class.getSimpleName();
    private Button btnMoveToPrevious;
    private EditText editText;

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

        editText = (EditText) findViewById(R.id.editText);

        btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
        btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = editText.getEditableText().toString();

                Intent mIntent = new Intent();
                mIntent.putExtra("keyName", message);
                setResult(RESULT_OK, mIntent);
                finish();

            }
        });

    }
}

3
잘 설명했다!
Radhey

5

첫 번째 활동에서 u를 사용하여 의도를 보낸 startActivityForResult()다음 사용을 마친 후 두 번째 활동에서 결과를 얻을 수 있습니다.setResult .

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.class

public class SecondActivity extends AppCompatActivity {

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

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

1

이 모든 답변은 데이터를 보낸 후 두 번째 활동의 시나리오를 완료해야한다고 설명합니다.

그러나 두 번째 활동을 끝내고 싶지 않고 데이터를 먼저 다시 보내려면 BroadCastReceiver를 사용할 수 있습니다.

두 번째 활동에서-

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

첫 활동에서

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

onCreate ()에 수신자를 등록하십시오.

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

onDestroy ()에서 등록 해제


0

상황에 따라 더 나은 원하는 결과를 얻는 또 다른 방법은 리스너 인터페이스를 만드는 것입니다.

필요한 활동을 매개 변수로 전달하면서 상위 활동이 하위 활동에 의해 트리거되는 인터페이스를 청취하게하면 유사한 상황 세트를 작성할 수 있습니다.


-1

이를 수행하는 몇 가지 방법이 있습니다. 1. 위의 답변에서 잘 설명 된 startActivityForResult ()를 사용하여.

  1. "Utils"클래스 또는 다른 클래스에서 정적 변수를 작성합니다. 예를 들어, StudentId를 ActivityB에서 ActivityA로 전달하고 싶습니다. 먼저 내 ActivityA가 ActivityB를 호출합니다. 그런 다음 ActivityB 내부에서 studentId (Utils.class의 정적 필드)를 설정하십시오. 이와 같이 Utils.STUDENT_ID = "1234"; 그런 다음 ActivityA로 돌아 오는 동안 Utils.STUDENT_ID에 저장된 studentId를 사용하십시오.

  2. 애플리케이션 클래스에서 getter 및 setter 메소드를 작성하십시오.

이처럼 :

public class MyApplication extends Application {

    private static MyApplication instance = null;
    private String studentId="";

    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public void setStudentId(String studentID){
        this.studentId=studentID;
    }

    public String getStudentId(){
        return this.studentId;
    }
}

그래서 당신은 끝났습니다. u가 ActivityB에있을 때 내부 데이터를 설정하고 ActivityA로 돌아온 후 데이터를 가져옵니다.


-1

위의 답변에서 누락 된 것으로 생각되는 작은 세부 사항입니다.

자녀의 활동이 여러 부모 활동에서 열 수 있다면 당신이 할 필요가 있다면 당신은 확인하실 수 있습니다 setResult활동에 의해 연 경우에 따라, 여부 startActivitystartActivityForResult. 을 사용하여이를 달성 할 수 있습니다 getCallingActivity(). 자세한 내용은 여기를 참조하십시오 .


-2

sharedPreferences 사용 하고 데이터와 응용 프로그램에서 어디서나 액세스 저장

이 같은 날짜를 저장

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

그리고 이와 같은 데이터를 수신

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);

6
두 번째 활동이 애플리케이션에서 영구적 인 변경 / 설정을 설정 한 경우 더 적합합니다.
elimirks

두 개의 다른 안드로이드 앱간에 데이터를 공유하려는 경우이 기능이 작동합니까?
joey rohan

21
이것은 SharedPreferences 남용입니다.
Eran Goldin

1
이 방법을 사용하여 두 활동 (OP의 원래 질문) 사이에 데이터를 전달하는 것은 SharedPreferences를 남용하는 것과 같습니다. 이것은 의미가 없으며 시스템이 두 활동 사이에 데이터를 전달하는 것과 같은 간단한 작업을 수행하기 위해 너무 많은 작업 (저장소에 xml 쓰기 및 다시 읽기)을 수행해야합니다.
Sudara
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.