2013-10-18 2 views
2

알림에서 시작하는 인 텐트에 문제가 있습니다 (정확하게는 2 가지 문제가 있음).알림의 인 텐트 선택자

나의 현재 상황은 모두 내가 처음으로 원격 서비스를 시작할 수있는 apk 패밀리가 있다는 것입니다. 이 서비스는 알림을 만들고 클릭하면 서비스를 시작한 응용 프로그램이 다시 열립니다. 이게 괜찮아.

나는 그 가족을 하나 이상의 응용 프로그램이 설치되어있을 때 서비스를 시작한 apk로가는 대신 선택기 인 텐트가 나타나고 사용자가 apk를 선택할 수있게 될 것이라고 생각했습니다. 돌아가다.

나는 이것을 할 수 있었다.

ArrayList<String> myApps = Lists.newArrayList(
      "com.myapp1", 
      "com.myapp2", 
      "com.myapp3", 
      "com.myapp4" 
    ); 

    List<Intent> targetedIntents = new ArrayList<Intent>(); 

    Intent baseIntent = new Intent(Intent.ACTION_MAIN, null); 
    baseIntent.addCategory("android.intent.category.LAUNCHER"); 

    final PackageManager packageManager = getApplicationContext().getPackageManager(); 
    List<ResolveInfo> list = packageManager.queryIntentActivities(baseIntent, 0); 

    for (ResolveInfo resolveInfo : list) { 
      String packageName = resolveInfo.activityInfo.packageName; 
      if (packageName != null && myApps.contains(packageName)) { 

       Intent targetedIntent = new Intent(); 
       targetedIntent.setPackage(packageName); 
       targetedIntent.setClassName(packageName, resolveInfo.activityInfo.name); 
       targetedIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

       targetedIntents.add(targetedIntent); 
      } 
    } 

    Intent intent = Intent.createChooser(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=whatever")), "Select app to return to"); 
    intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{})); 

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, intent.getFlags()); 
    notification.setLatestEventInfo(this, notificationTitle, notificationMessage, contentIntent); 

이것은 주로 작동해야합니다. 선택기가 나타나고 선택한 옵션이 원하는 apk를 실행합니다.

하지만이 문제가 건너 온 : 나는 나에게 관심에만 의도와 목적 선택기를 만들 때

I.이 선택기는 메시지와 함께 비어

 intent = Intent.createChooser(targetedIntents.get(0), "Select app to return to"); 
    intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{})); 
"어떤 응용 프로그램이 작업을 수행 할 수 없습니다"

하지만 Google Play와 같이 existing apk there first을 입력하면 모든 항목이 작동하고 내 옵션이 Google 재생 옵션과 함께 표시됩니다.

 intent = Intent.createChooser(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=whatever")), "Select app to return to"); 
    intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{})); 

이것은 내가 살 수있는 것이지만 적절한 apks가 있다면 더 좋을 것입니다.

II. 목록에서 apk를 클릭하면 백그라운드에서 돌아 오는 대신 (apk가 이미 실행중인 경우) 다시 시작됩니다. 적절한 플래그가 설정되어 있습니다.

Intent targetedIntent = new Intent(); 
    targetedIntent.setPackage(packageName); 
    targetedIntent.setClassName(packageName, resolveInfo.activityInfo.name); 
    targetedIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

선택기를 사용하기 전에 나는 하나의 의도 만 실행하고 정상적으로 백그라운드 APK를 다시 시작했습니다.

intent = new Intent(this, MainActivity.class); 
    intent.setAction("android.intent.action.MAIN"); 
    intent.addCategory("android.intent.category.LAUNCHER"); 

apk가 다시 시작될 때 내가 무엇을 잘못하고 있는지 확실하지 않습니다.

답변

2

첫 번째 문제 (선택기 문제)의 경우 에 전달중인 getChooser()에 Android에서 사용할 수있는 ACTION이 없으므로 "아무 프로그램도이 작업을 수행 할 수 없음"이라는 오류 메시지가 표시됩니다. Intent을 처리 할 수있는 응용 프로그램을 검색하십시오. getChooserIntent에서 ACTION, CATEGORY 및 DATA를 사용하여 적합한 응용 프로그램을 검색합니다. 그런 다음 패키지 및 구성 요소 이름을 사용하여이 목록을 필터링합니다. 귀하의 경우 패키지와 구성 요소 이름 만 제공 했으므로 (ACTION을 지정하지 않았으므로) Android는 적합한 응용 프로그램을 찾을 수 없습니다. 다른 패키지를 사용하여 목록을 작성하려는 경우이 방법이 있을지 모르겠습니다. 자신 만의 선택기 대화 상자를 만들어야 할 수도 있습니다. (아마도 목록에 포함 할 내용을 결정했기 때문에 안드로이드 선택기를 사용하면 아무런 이점이 없기 때문에 어쨌든 여기에서 할 수 있습니다.)를 가져올 것이다 태스크의 루트 액티비티를 시작할 때

targetedIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

Intent.FLAG_ACTIVITY_NEW_TASK 지정 : 두 번째 문제 (응용 프로그램이 백그라운드에있는 경우, 그것은 다시 시작됩니다) 다음과 같은 플래그를 사용할 필요가 들어


이미 존재하는 작업을 포 그라운드로 보냅니다.

참고 : 기존 작업을 포 그라운드로 가져 오려면 (어떤 상태가 되든간에) Intent.FLAG_ACTIVITY_NEW_TASK을 사용하고 다른 2 개의 플래그를 제거하십시오.

+0

두 번째 문제에 대한 두 번째 해결 방법은 정상적으로 작동합니다. 나는 chooser에 대한 내 자신의 대화 상자를 만드는 것에 대한 질문을 가지고있다. (나는 그것이 유일한 resonable 한 해결책이라고 생각했다.) 선택자가 계류중인 사람으로부터 시작 되었기 때문에 어떻게 할 것인가? (아무데도 대화를 시작할 수 없습니다.) – darkhie

+0

알림에서 대화 상자처럼 보이는 활동을 시작할 수 있습니다. StackOverflow를 검색하면 예제를 찾을 수 있습니다. –