[android] Android 애플리케이션의 활동간에 데이터를 전달하려면 어떻게합니까?

나는 로그인 페이지를 통해 로그인 한 후, 사인 아웃있을 것 시나리오가 button각을 activity.

를 클릭하면 로그인 한 사용자를 로그 아웃 sign-out하도록 전달합니다 session id. 누구든지 모든 사람이 session id이용할 수있는 방법을 알려줄 수 activities있습니까?

이 경우에 대한 대안



답변

가장 쉬운 방법은 세션 ID를 활동 Intent을 시작하는 데 사용 하는 사인 아웃 활동으로 전달하는 것입니다 .

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

다음 활동에 대한 의도에 액세스하십시오.

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

문서 인 텐트에 대한 자세한 내용은 ( “엑스트라”라는 제목의 섹션을 확인합니다)가 있습니다.


답변

현재 활동에서 다음을 새로 작성하십시오 Intent.

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);
i.putExtra("key",value);
startActivity(i);

그런 다음 새 활동에서 해당 값을 검색하십시오.

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

이 기법을 사용하여 한 활동에서 다른 활동으로 변수를 전달하십시오.


답변

통과 의도Erich가 지적한 것처럼 인 엑스트라를 하는 것이 좋은 방법입니다.

그만큼 응용 프로그램 객체하지만 다른 방법이며, (/ 얻을 사방에 넣어도록하는 것과는 반대로) 여러 활동에서 동일한 상태를 처리 할 때 때로는 쉽게, 또는 원시 및 문자열보다 더 복잡한 객체.

응용 프로그램을 확장 한 다음 원하는 것을 설정 / 가져 와서 getApplication ()을 사용하여 동일한 응용 프로그램의 모든 활동에서 액세스 할 수 있습니다 .

또한 정적과 같은 다른 접근 방식 은 메모리 누수로 이어질 수 있으므로 문제가 될 수 있습니다 . 응용 프로그램도이 문제를 해결하는 데 도움이됩니다.


답변

소스 클래스 :

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)

대상 클래스 (NewActivity 클래스) :

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    Intent intent = getIntent();

    String fName = intent.getStringExtra("firstName");
    String lName = intent.getStringExtra("lastName");
}


답변

당신은 당신의 의도를 부르는 동안 여분을 보내야합니다.

이처럼 :

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

지금 OnCreate당신 의 방법에SecondActivity 이와 같은 엑스트라를 가져올 수 있습니다.

보낸 값이 다음과long 같은 경우

long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));

보낸 값이String :

String value = getIntent().getStringExtra("Variable name which you sent as an extra");

보낸 값이Boolean :

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);


답변

상황에 맞는 것을 볼 수있게 도와줍니다. 다음은 두 가지 예입니다.

데이터 전달

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

주요 활동

  • 보내려는 데이터를 키-값 쌍으로 인 텐트에 넣습니다. 키의 명명 규칙에 대해서는 이 답변 을 참조하십시오 .
  • 로 두 번째 활동을 시작하십시오 startActivity.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @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) {

        // get the text to pass
        EditText editText = (EditText) findViewById(R.id.editText);
        String textToPass = editText.getText().toString();

        // start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra(Intent.EXTRA_TEXT, textToPass);
        startActivity(intent);
    }
}

두 번째 활동

  • 두 번째 활동을 시작하는 데 사용 getIntent()합니다 Intent. 그런 다음 getExtras()첫 번째 활동에서 정의한 키와 키를 사용하여 데이터를 추출 할 수 있습니다 . 우리의 데이터는 문자열이기 때문에 getStringExtra여기서 사용 합니다.

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

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

        // get the text from MainActivity
        Intent intent = getIntent();
        String text = intent.getStringExtra(Intent.EXTRA_TEXT);

        // use the text in a TextView
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(text);
    }
}

데이터 전달

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

주요 활동

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

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(Intent.EXTRA_TEXT);

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

두 번째 활동

  • 이전 활동으로 다시 보내려는 데이터를에 넣습니다 Intent. 데이터는 Intent키-값 쌍을 사용하여 저장됩니다 . 나는 Intent.EXTRA_TEXT내 열쇠 를 사용 하기로 결정했다 .
  • 결과를 설정하고 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(Intent.EXTRA_TEXT, stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}


답변

업데이트 됨 SharedPreference 사용에 대해 언급했습니다 . 간단한 API를 가지고 있으며 응용 프로그램 활동을 통해 액세스 할 수 있습니다. 그러나 이것은 서투른 솔루션이며 민감한 데이터를 전달하면 보안 위험이 있습니다. 의도를 사용하는 것이 가장 좋습니다. 활동간에 여러 가지 다른 데이터 유형을 더 잘 전송하는 데 사용할 수있는 과부하 된 메소드의 광범위한 목록이 있습니다. intent.putExtra를 살펴 보십시오 . 이 링크 는 putExtra의 사용법을 잘 보여줍니다.

활동간에 데이터를 전달할 때 필자가 선호하는 접근법은 필요한 매개 변수를 포함하여 관련 활동에 대한 정적 메소드를 작성하여 의도를 시작하는 것입니다. 그러면 매개 변수를 쉽게 설정하고 검색 할 수 있습니다. 이렇게 보일 수 있습니다

public class MyActivity extends Activity {
    public static final String ARG_PARAM1 = "arg_param1";
...
public static getIntent(Activity from, String param1, Long param2...) {
    Intent intent = new Intent(from, MyActivity.class);
        intent.putExtra(ARG_PARAM1, param1);
        intent.putExtra(ARG_PARAM2, param2);
        return intent;
}

....
// Use it like this.
startActivity(MyActvitiy.getIntent(FromActivity.this, varA, varB, ...));
...

그런 다음 의도 한 활동에 대한 의도를 작성하고 모든 매개 변수를 확보 할 수 있습니다. 조각에 적응할 수 있습니다. 위의 간단한 예이지만 아이디어를 얻습니다.