programing

활동 외부에서 활동 시작()을 호출하시겠습니까?

muds 2023. 10. 18. 23:05
반응형

활동 외부에서 활동 시작()을 호출하시겠습니까?

사용하고 있습니다.AlarmManager신호를 전송하는 의도를 유발하는 겁니다다음은 제 코드입니다.

AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(this, Wakeup.class);
try
{
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
    Long elapsed +=  // sleep time;
    mgr.set(AlarmManager.RTC_WAKEUP, elapsed, pi);
}
catch(Exception r)
{
    Log.v(TAG, "RunTimeException: " + r);
}

이 코드를 불러봅니다.Activity, 그래서 어떻게 다음과 같은 오류를 얻을 수 있을지 모르겠습니다.

ERROR/AndroidRuntime(7557): java.lang.RuntimeException: Unable to start receiver com.wcc.Wakeup: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

Android 버전이 Android - 6 이하이면 이 줄을 추가해야 합니다. 그렇지 않으면 Android - 6 이상에서 작동합니다.

...
Intent i = new Intent(this, Wakeup.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
...

동일한 활동의 다중 인스턴스의 경우 다음 토막글을 사용합니다.

참고: 이 토막글은 외부에서 사용하고 있습니다.Activity. 당신의 것을 확인하세요.AndroidManifest파일에 포함되지 않음android:launchMode="singleTop|singleInstance". 필요하다면 다음과 같이 변경할 수 있습니다.android:launchMode="standard".

Intent i = new Intent().setClass(mActivity.getApplication(), TestUserProfileScreenActivity.class);  
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

// Launch the new activity and add the additional flags to the intent
mActivity.getApplication().startActivity(i);

저는 이 정도면 괜찮습니다.호프, 그럼 누군가의 시간을 절약할 수 있겠군요.더 좋은 방법을 찾으신 분이 있다면 저희와 공유해 주시기 바랍니다.

Android Doc은 이렇게 말합니다.

FLAG_ACTIVE_NEW_TASK 요구 사항이 이제 적용됩니다.

Android 9에서는 의도 플래그 FLAG_ACTIVE_NEW_TASK를 전달하지 않으면 비활동 컨텍스트에서 활동을 시작할 수 없습니다.이 플래그를 전달하지 않고 작업을 시작하려고 하면 작업이 시작되지 않고 시스템이 로그에 메시지를 인쇄합니다.

참고: 플래그 요구 사항은 항상 의도된 동작이며 Android 7.0(API 레벨 24)보다 낮은 버전에서 적용되었습니다.안드로이드 7.0의 버그로 인해 플래그 요구 사항이 적용되지 않았습니다.

은 을 합니다.(Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)를 추가하는 것은 필수입니다.Intent.FLAG_ACTIVITY_NEW_TASK부르면서startActivity() Activity맥락.

따라서 모든 버전에 대해 플래그를 추가하는 것이 좋습니다.

...
Intent i = new Intent(this, Wakeup.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
...

당신이 전화하는 부분을 붙여넣지 않았습니다.startActivity, 그게 재미있는 부분입니다.

전화하시는 것 같습니다.startActivity일순간에Service상황에 따라 또는Application맥락.

다음을 만들기 전에 로그 고양이에게 "이것"을 인쇄합니다.startActivity전화를 걸어 어떤 의미인지 확인해 보세요. 때때로 실수로 내부의 "이것"을 사용하는 경우가 있습니다.

때때로 이 오류는 에 대한 명시적인 호출 없이 발생할 수 있습니다.startActivity(...)를 들어,를 본 도 있습니다 예를 들어, Crashlytics에서 이와 같은 스택 트레이스를 본 적이 있을 수 있습니다.

Fatal Exception: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
       at android.app.ContextImpl.startActivity(ContextImpl.java:1597)
       at android.app.ContextImpl.startActivity(ContextImpl.java:1584)
       at android.content.ContextWrapper.startActivity(ContextWrapper.java:337)
       at android.text.style.URLSpan.onClick(URLSpan.java:62)
       at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:217)
       at android.widget.TextView.onTouchEvent(TextView.java:9522)
       at android.view.View.dispatchTouchEvent(View.java:8968)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.widget.AbsListView.dispatchTouchEvent(AbsListView.java:5303)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2559)
       at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1767)
       at android.app.Activity.dispatchTouchEvent(Activity.java:2866)
       at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
       at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2520)
       at android.view.View.dispatchPointerEvent(View.java:9173)
       at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4706)
       at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4544)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4121)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4087)
       at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4201)
       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4095)
       at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4258)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4121)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4087)
       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4095)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068)
       at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6564)
       at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6454)
       at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6425)
       at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6654)
       at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:143)
       at android.os.Looper.loop(Looper.java:130)
       at android.app.ActivityThread.main(ActivityThread.java:5942)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

그리고 트레이스에는 프레임워크 코드만 포함되어 있기 때문에 무엇을 잘못했는지 궁금할 수 있습니다.자, 어떻게 이런 일이 발생할 수 있는지에 대한 예시가 있습니다.우리가 한 조각이 됐다고 치자.

Activity activity = getActivity();
Context activityContext = activity;
Context appContext = activityContext.getApplicationContext();
LayoutInflater inflater = LayoutInflater.from(appContext); // whoops!
View view = inflater.inflate(R.layout.some_layout, parent, false);
TextView tvWithLinks = (TextView) view.findViewById(R.id.tv_with_links);

tvWithLinks.setMovementMethod(LinkMovementMethod.getInstance()); // whoops!!

이제 사용자가 해당 텍스트 보기를 클릭하면 위의 스택 트레이스와 함께 앱이 충돌합니다.레이아웃 인플레이터응용프로그램 컨텍스트에 대한 참조가 있으므로 텍스트 보기에 응용프로그램 컨텍스트가 있기 때문입니다.해당 텍스트 보기를 클릭하면 암묵적으로 호출됩니다.appContext.startActivity(...).

마지막 노트:안드로이드 4,5,6,7 기기에서 테스트해봤습니다.4, 5, 6에만 영향을 미칩니다.Android 7 기기는 통화하는데 문제가 없는 것으로 보입니다.appContext.startActivity(...).

이것이 다른 사람에게 도움이 되길 바랍니다!

다음 줄로 변경해 보십시오.

PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 0, i, 0);

난 그저 그 사실을 알아채고 싶을 뿐입니다.startActivity외부 활동은 일부 안드로이드 버전(N과 O-MR1 사이)에서 유효하며 흥미로운 점은 안드로이드 소스 코드의 버그라는 것입니다!


위의 댓글입니다.startActivity실행.여기 보세요.

FLAG_ACTIVITY_NEW_TASK 없이 활동 외부에서 활동 시작을 호출하는 것은 일반적으로 허용되지 않습니다. 단, 호출자가 활동을 시작해야 하는 작업 ID를 지정하는 경우는 예외입니다.N과 O-MR1 사이에 버그가 존재하여 이것이 작동할 수 있었습니다.

최신 Android 장치 9 및 10에서 Notification을 받을 때 직면했던 동일한 오류입니다.

실행 모드에 따라 처리 방법이 달라집니다.아래 코드 사용:- 안드로이드:launchMode="single task"

Intent:-intent.setFlags(Intent)로 이 플래그를 추가합니다.FLAG_ACTIVE_NEW_TASK);

제 경우에는 다음을 위해 컨텍스트를 사용했습니다.startActivity, 그것을 바꾸고 나서ActivityName.this. 해결됩니다.저는 util 수업에서 메소드를 사용하고 있어서 이렇게 됩니다.

누군가에게 도움이 되길 바랍니다.

앱 내에서 활동을 열고 싶을 때 의도를 매개변수로 하여 startActivity() 메서드를 호출할 수 있습니다.그 의도는 당신이 열고자 하는 활동일 것입니다.먼저 컨텍스트가 될 첫 번째 매개 변수와 대상 활동 클래스가 될 두 번째 매개 변수를 사용하여 해당 의도의 개체를 만들어야 합니다.

Intent intent = new Intent(this, Activity_a.class);
startActivity(intent);

이것이 도움이 되길 바랍니다.

코드는 여기 있습니다.저는 벽지 API 구현 앱에서 구현해 보았습니다.특히 내 앱에서 사용자가 배경화면 이미지를 클릭하면 전체 화면 보기에서 배경화면 이미지가 반전됩니다.

holder.imageView.setOnClickListener {
          val i = Intent(context,FullScreenWallpaper::class.java)
          i.putExtra("raheel", wallpaperModelList2[position])
          i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
          context.startActivity(i)
      }

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

반응형