programing

활동 컨텍스트 외부에서 시작 활동() 호출

muds 2023. 5. 31. 18:36
반응형

활동 컨텍스트 외부에서 시작 활동() 호출

는 다을구습다니했현음을 했습니다.ListView내 안드로이드 애플리케이션에서.나는 이것에 구속합니다.ListView의 사용자 ArrayAdapter된 래스 에. 오버라이드된 내부ArrayAdapter.getView(...) 나드할니다합당는소메를 합니다.OnClickListener에서.에서onClickOnClickListener저는 새로운 활동을 시작하고 싶습니다.예외가 있습니다.

Calling startActivity() from outside of an Activity  context requires the  
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

어떻게 하면 얻을 수 있습니까?Context그것은ListView (으)로 표시됨)Activity 하고 있습니까?) 아래에서 작업하고 있습니까?

어느 하나

  • 어댑터의 생성자를 통해 컨텍스트 개체를 캐시합니다.
  • 당신의 관점에서 그것을 얻습니다.

아니면 최후의 수단으로

  • 의도에 - FLAG_ACTIVE_NEW_TASK 플래그를 추가합니다.

_

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

편집 - 이벤트 및 기록 스택의 정상적인 흐름을 방해하기 때문에 플래그를 설정하지 않습니다.

대신 addFlags를 사용하여 이를 달성할 수 있습니다.setFlags

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

설명서에 따르면 다음 작업을 수행합니다.

의도(또는 기존 플래그 값)에 플래그를 추가합니다.


편집

Alex Volovoy의 답변에 따라 기록 스택을 변경할 수 있는 플래그를 사용할 때는 주의하십시오.

...이벤트 및 기록 스택의 정상적인 흐름을 방해하므로 플래그를 설정할 수 없습니다.

사하는대를 사용하는 에.(getApplicationContext)사용하다YourActivity.this

아래와 같이 만들기 선택기를 사용하여 오류가 발생한 경우:

Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setData(Uri.parse("http://google.com"));
startActivity(Intent.createChooser(sharingIntent, "Open With"));

다음과 같이 선택기를 작성하도록 플래그를 설정합니다.

Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setData(Uri.parse("http://google.com"));

Intent chooserIntent = Intent.createChooser(sharingIntent, "Open With");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(chooserIntent);

또한: 목록 보기에 링크를 조각으로 표시하는 경우 이렇게 만들지 마십시오.

adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings);

대신 전화를 걸었습니다.

adapter = new ListAdapter(getActivity(),mStrings);

어댑터는 두 경우 모두 잘 작동하지만 링크는 마지막 경우에만 작동합니다.

OnClickListener를 잘못된 위치에 구현하고 있는 것 같습니다. 일반적으로 활동에 OnItemClickListener를 구현하고 대신 ListView에 설정해야 합니다. 그렇지 않으면 이벤트에 문제가 생길 수 있습니다.

Android 28(Android P) 시작하기

if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
        && (targetSdkVersion < Build.VERSION_CODES.N
                || targetSdkVersion >= Build.VERSION_CODES.P)
        && (options == null
                || ActivityOptions.fromBundle(options).getLaunchTaskId() == -1)) {
    throw new AndroidRuntimeException(
            "Calling startActivity() from outside of an Activity "
                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
                    + " Is this really what you want?");
}

그래서 가장 좋은 방법은 추가하는 것입니다.FLAG_ACTIVITY_NEW_TASK

Intent intent = new Intent(context, XXXActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);

또는

Context mContext = getAppliactionContext();
CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

아래로 변경

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);

어떤 방법으로 리스트라이너 내에 의도를 작성하는 경우 참고하십시오.

override onClick (View v).

그런 다음 이 보기를 통해 컨텍스트도 호출합니다.

v.getContext ()

깃발을 세울 필요도 없을 것입니다...

사마린에서 이걸 받는 사람은 누구든지.활동에서 StartActivity를 호출해도 Android(MonoDroid) - 실제로는 새로운 ART 런타임이 있는 Xamarin 버그입니다. https://bugzilla.xamarin.com/show_bug.cgi?id=17630 를 참조하십시오.

알렉스 볼로보이의 대답을 조금 더 자세히 설명하자면-

fragment와 관련하여 이 문제가 발생하는 경우 getActivity()는 컨텍스트를 얻기 위해 잘 작동합니다.

다른 경우:

만약 당신이 사용하기를 원하지 않는다면,

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend

그런 다음 외부 클래스에서 이런 기능을 만듭니다.

public void gettingContext(Context context){
    real_context = context;//where real_context is a global variable of type Context
}

이제 주요 활동에서 새로운 OutsideClass를 만들 때마다 활동의 컨텍스트를 인수로 제공하는 OutsideClass를 정의한 후 바로 위의 메서드를 호출합니다.또한 주요 활동에서 다음과 같은 기능을 수행합니다.

public void startNewActivity(final String activity_to_start) {
    if(activity_to_start.equals("ACTIVITY_KEY"));
    //ACTIVITY_KEY-is a custom key,just to
    //differentiate different activities
    Intent i = new Intent(MainActivity.this, ActivityToStartName.class);
    activity_context.startActivity(i);      
}//you can make a if-else ladder or use switch-case

이제 당신의 외부 수업으로 돌아와 새로운 활동을 시작하려면 다음과 같은 것을 하라.

@Override
public void onClick(View v) {
........
case R.id.any_button:

            MainActivity mainAct = (MainActivity) real_context;             
            mainAct.startNewActivity("ACTIVITY_KEY");                   

        break;
    }
........
}

이렇게 하면 플래그를 조작하지 않고 다른 Outside Class에서 호출된 다양한 활동을 시작할 수 있습니다.

참고-프래그먼트에 대해 생성자를 통해 컨텍스트 개체를 캐시하지 마십시오(어댑터를 사용하면 괜찮습니다).일부 시나리오에서는 조각에 빈 생성자가 있어야 합니다. 그렇지 않으면 응용 프로그램이 충돌합니다.

전화하는 것을 잊지 마세요

OutsideClass.gettingContext(Context context);

onResume() 기능에도 적용됩니다.

이 오류는 시작 활동이 어떤 활동인지 모를 때 발생합니다.따라서 활동을 시작하기 전에 활동을 추가해야 합니다().

설정해야 합니다.

context.startActivity(yourIntent);

제 생각에는, 의 방법을 사용하는 것이 더 좋습니다.startActivity()바로 당신의 코드로.Activity.class만약 당신이 그것을 사용한다면.Adapter아니면 다른 수업, 그것은 결과를 초래할 것입니다.

저도 같은 문제를 겪었습니다.통과한 모든 컨텍스트를 확인합니다.'링크'의 경우 응용프로그램 컨텍스트가 아닌 활동 컨텍스트가 필요합니다.

다음 위치를 확인해야 합니다.

1.) LayoutInplater를 사용한 경우 전달된 컨텍스트를 확인합니다.

2.) 어댑터를 사용하는 경우 전달된 컨텍스트를 확인합니다.

에서 이 하고 Adapter_Activity를 합니다.context.startActivity(intent_Object)그리고.intent_Object.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

다음과 같이:

Intent n_act = new Intent(context, N_Activity.class);
n_act.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(n_act);

작동합니다...

하는 위치에서 활어(으)로 변경하면 됩니다.getActivityContext()와 함께YourActivity.this다음은 예입니다.

yourAdapter = new YourAdapter(yourList, YourActivity.this); // Here YourActivity.this is the Context instead of getActivityContext()
recyclerView.setAdapter(yourAdapter);
Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);    
viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    
startActivity(viewIntent);   

이것이 효과가 있기를 바랍니다.

동일한 문제에 직면한 후 구현

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

그리고 그 문제를 해결했습니다.

목록 보기 어댑터와 관련된 다른 이유가 있을 수 있습니다.
블로그를 보실 수 있습니다. 아주 잘 설명했습니다.

이 코드를 사용합니다.저한테는 잘 맞습니다.활동 외부에서 무언가 공유하기:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");

// Append Text
String Text = "Your Text Here"

intent.putExtra(Intent.EXTRA_TEXT, Text);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Intent shareIntent = Intent.createChooser(intent,"Share . . . ");
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
G.context.getApplicationContext().startActivity(shareIntent);

플래그를 추가하면 영향을 받기 때문입니다.event_flow그리고.stack_history다음과 같은 방법으로 활동 클래스를 호출해야 하는 비활동에 '응용프로그램 컨텍스트'를 전달하는 것이 좋습니다.

"ActivityClassName.this"(이 방법으로 컨텍스트를 전달하는 동안 비활동 시나리오에서 활동을 호출하는 데 필요한 모든 세부 정보와 정보가 포함됩니다.)

따라서 플래그를 설정하거나 추가할 필요가 없습니다. 모든 경우에 잘 작동합니다.

데이터 바인딩을 사용하는 경우 다음과 같이 컨텍스트를 가져옵니다.

binding.root.context

이것으로 저의 문제가 해결되었습니다.

Intent i= new Intent(context, NextActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Cordova 플러그인에서 share Intent를 호출하는 경우 플래그를 설정하면 도움이 되지 않습니다.대신 이것을 사용합니다 -

cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "title"));

제 상황은 조금 달랐습니다, 저는 앱을 사용하여 테스트하고 있습니다.Espresso그리고 저는 제 활동을 시작해야 했습니다.ActivityTestRule계기에서.Context(이것은 어떤 것에서 오는 것이 아닙니다.Activity).

fun intent(context: Context) = 
    Intent(context, HomeActivity::class.java)
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

나는 깃발을 바꾸고 추가해야 했습니다.or비트적으로(|자바로)와 함께Intent.FLAG_ACTIVITY_NEW_TASK

결과는 다음과 같습니다.

fun intent(context: Context) = 
    Intent(context, HomeActivity::class.java)
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)

코틀린 버전

val intent = Intent(Intent.ACTION_EDIT, ContactsContract.Profile.CONTENT_URI)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
this.startActivity(intent)

활동 컨텍스트 외부에서 startActivity() 호출 보기에서 가져옵니다.

하지 마

val context = activity.applicationContext
openBrowser(context, MenuUrl.TERM_CONDITION)

   1. val context = binding.root.context // If you are using view binding
   2. val context = yourView.context // If you are not use view binding
    openBrowser(context, MenuUrl.TERM_CONDITION)

감사해요.

사마린에서 오는 사람들을 위해.형태 또는 사마린.안드로이드, 당신의 사마린에.Android 프로젝트, 사용:

Xamarin.Essentials.Platform.CurrentActivity.StartActivity(intent);

여기에는 Xamarin이 필요할 수 있습니다.Essentials v1.5 이상

@Alex Volovoy가 언급했듯이 플래그 설정은 이벤트 및 기록 스택의 정상적인 흐름을 방해하므로 피해야 합니다.

Chrome 사용자 지정 탭을 사용하는 경우

 if (ctx.isPackageInstalled("com.android.chrome")) {
        customBuilder.apply {
            intent.setPackage("com.android.chrome")
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) //Add This Flag
            launchUrl(ctx, Uri.parse(URL))
        }

    }

언급URL : https://stackoverflow.com/questions/3918517/calling-startactivity-from-outside-of-an-activity-context

반응형