매개 변수를 사용하여 활동 시작


292

나는 안드로이드 개발에 매우 ​​익숙하다.

게임에 관한 정보를 보여주는 활동을 만들고 시작하고 싶습니다. gameId가 필요한 정보를 보여줍니다.

이 게임 ID를 액티비티에 전달하려면 어떻게해야합니까? 게임 ID는 절대적으로 필요하므로 ID가 없으면 활동을 만들거나 시작하고 싶지 않습니다.

활동 만 가지고 같아 하나 하나 개의 매개 변수로 생성자를.

어떻게해야합니까?

감사.

답변:


506

int귀하의 아이디 인를 ​​새로운에 넣으십시오 Intent.

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
Bundle b = new Bundle();
b.putInt("key", 1); //Your id
intent.putExtras(b); //Put your id to your next Intent
startActivity(intent);
finish();

그런 다음 새 ID를 가져옵니다 Activity.

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");

42
잡아 내기 전에 b! = null을 확인하고 싶을 수도 있습니다.
Andrew

이 코드의 두 번째 활동에서 "b"가 어떻게 null 일 수 있습니까? 두 번째 활동의 작성 메소드에서 b가 null이됩니다.
Murat Çorlu

3
B는 null 일 수 있습니다. 다른 곳에서이 활동을 시작하고 매개 변수없이 표준 방식으로 수행한다고 가정하겠습니다. NPE를 던질 것입니다. 항상이 매개 변수를 선택 사항으로 고려해야합니다.
Gaspar de Elias

53
새 번들을 만들 필요는 없습니다 . 설명서 에 패키지 이름을 "필수"로 지정해야하는 경우에는 키를 접두어로 사용하십시오 intent.putExtra(String, Int).
Sam

1
널 검사를하지 않는 것이 더 낫다고 주장 할 수 있습니다. en.wikipedia.org/wiki/ 실패 .
setholopolus

124

활동을 호출하는 데 사용하려는 의도에 추가 데이터를 추가하기 만하면됩니다.

발신자 활동에서 :

Intent i = new Intent(this, TheNextActivity.class);
i.putExtra("id", id);
startActivity(i);

호출하는 활동의 onCreate () 안에서 :

Bundle b = getIntent().getExtras();
int id = b.getInt("id");

1
사용자 정의 객체 유형을 전달해도됩니까?
Amyth

1
@Amyth 아니오, 허용 된 답변과 같은 번들을 사용해야합니다.
AtlasRider


38

두 번째 활동에서 정적 메소드로 수행하고 싶습니다.

private static final String EXTRA_GAME_ID = "your.package.gameId";

public static void start(Context context, String gameId) {
    Intent intent = new Intent(context, SecondActivity.class);
    intent.putExtra(EXTRA_GAME_ID, gameId);
    context.startActivity(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    ... 
    Intent intent = this.getIntent();
    String gameId = intent.getStringExtra(EXTRA_GAME_ID);
}

그런 다음 첫 번째 활동 (및 다른 곳)에서 다음을 수행하십시오.

SecondActivity.start(this, "the.game.id");

정확히 내가 찾던 것! 감사합니다
Matteo

1
에서 onCreate 방법은 안 String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);String gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep

정적 기능이 있으면 테스트가 매우 어려워집니다.
John Tribe

이것이 메모리 누수입니까? 정적 메소드에 컨텍스트를 전달하는 것은 나에게 나쁜 생각처럼 보입니다. 인 텐트를 반환 한 다음 첫 번째 클래스에서 해당 인 텐트를 사용하여 활동을 시작하는 것이 어떻습니까?
AndroidDev

4

코 틀린 코드 :

시작 SecondActivity:

startActivity(Intent(context, SecondActivity::class.java)
    .putExtra(SecondActivity.PARAM_GAME_ID, gameId))

에 ID를 얻으십시오 SecondActivity:

class CaptureActivity : AppCompatActivity() {

    companion object {
        const val PARAM_GAME_ID = "PARAM_GAME_ID"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val gameId = intent.getStringExtra(PARAM_GAME_ID)
        // TODO use gameId
    }
}

여기서 gameId하다 String? (널 (null) 일 수 있음)


3

기존 답변 (전달 된 데이터 Intent전달 startActivity()) 은이 문제를 해결하는 일반적인 방법을 보여줍니다. (예를 들어,의 편집 활동 중 하나 다른 응용 프로그램에 의해 시작됩니다 액티비티 만들 경우 홀수 경우에 사용할 수있는 다른 해결책이있다 테스 커의 제어하지 않는 때문에 플러그인을)하고 Intent있는 시작하는이 Activity.

Activity매개 변수가있는 생성자를 가진 기본 클래스를 만든 다음 기본 클래스 생성자를 호출하는 기본 생성자가있는 파생 클래스를 다음과 같이 만들 수 있습니다 .

class BaseActivity extends Activity
{
    public BaseActivity(String param)
    {
        // Do something with param
    }
}

class DerivedActivity extends BaseActivity
{
    public DerivedActivity()
    {
        super("parameter");
    }
}

기본 클래스 생성자에 전달할 매개 변수를 생성해야하는 경우, 하드 코딩 된 값을 전달할 올바른 값을 리턴하는 함수 호출로 바꾸십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.