[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, ...));
...
그런 다음 의도 한 활동에 대한 의도를 작성하고 모든 매개 변수를 확보 할 수 있습니다. 조각에 적응할 수 있습니다. 위의 간단한 예이지만 아이디어를 얻습니다.