2

내 응용 프로그램 위젯에서 다른 응용 프로그램을 시작하고 싶습니다. 위젯은 항목 목록이며 항목을 클릭하면 Google Plus와 같은 앱이 열립니다. 목록에서 항목을 누르면 아무 일도 일어나지 않습니다. setData 및 setComponentName을 제거하면 사용할 앱을 묻는 대화 상자가 나타납니다. appWidget 콜렉션의 PendingIntent와 데이터 및 componentname을 병합 할 수 있습니까?AppWidget setFillInIntent가 setData 또는 componentName에 설정된 데이터를 처리 할 수 ​​없습니까?

public class StreamsWidgetProvider extends AppWidgetProvider { 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    final int N = appWidgetIds.length; 

     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 

      ... 

      //set service for list view 
      Intent listIntent = new Intent(context, StreamsWidgetService.class); 
      listIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
      listIntent.setData(Uri.parse(listIntent.toUri(Intent.URI_INTENT_SCHEME))); 
      views.setRemoteAdapter(R.id.streamItemsList, listIntent); 

      ... 

      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
      views.setPendingIntentTemplate(R.id.streamItemsList, pendingIntent); 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 

     super.onUpdate(context, appWidgetManager, appWidgetIds); 
    } 
} 

}

을 그리고 StreamsWidgetService은 다음과 같습니다 :

내의 AppWidgetProvider는 다음과 같습니다 fillIntent없이 정상적인 활동을 사용하는 경우

public class StreamsWidgetService extends RemoteViewsService { 
    private static final String TAG = "StreamsWidgetService"; 

    @Override 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     return new StreamItemWidgetFactory(intent); 
    } 

    private class StreamItemWidgetFactory implements RemoteViewsService.RemoteViewsFactory { 
     @Override 
     public RemoteViews getViewAt(int position) { 
      StreamItem item = mItems.get(position); 

      RemoteViews rv = new RemoteViews(getPackageName(), R.layout.widget_item); 
      ... 

      Intent intent = new Intent(); 
      intent.setData(ContentUris.withAppendedId(StreamItems.CONTENT_URI, item.getId())); 

      AccountType at = item.getAccountType(); 
      intent.setComponent(new ComponentName(at.getPackageName(), at.getViewStreamItemActivity())); 
      rv.setOnClickFillInIntent(R.id.streamItemRowId, intent); 
      Log.d(TAG, "FillIntent set for " + item.getId() + " at position " + position + " with data " + intent.getDataString() + " and component " + intent.getComponent().toString()); 

      return rv; 
     } 

     ... 
    } 
} 

이 작품 :

final AccountType at = item.getAccountType(); 
final Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setData(ContentUris.withAppendedId(StreamItems.CONTENT_URI, item.getId())); 
intent.setClassName(at.getPackageName(), at.getViewStreamItemActivity()); 
startActivity(intent); 

어떻게 해결할 수 있습니까? 내가 잘못하고 있는게 뭐지?

답변

2

PendingIntent 허용하지 않는 구성 요소가 채워진 할 당신이 특별히 요청하지 않는 한. 이 다른 FILL_IN_* 플래그의 작업 방식과 다른 것을

PendingIntent pendingIntent = PendingIntent.getActivity(context, 
    0, intent, Intent.FILL_IN_COMPONENT); 

참고.

+0

나는 이것을 시도해보고 그것이 효과가 있다면 받아 들인 대답으로 대답하도록 설정할 것입니다. :) – Daverix

+1

+1 잘 근무했습니다. – levi

+0

[Daverix answer] (http://stackoverflow.com/a/12727542/1105473)에서 메서드를 사용하고 있었지만 속도가 매우 느려 보였습니다. 그래서 저는 클릭으로 Activity를 직접 시작하려했으나 답을 얻었지만 더 빠르게 보이지는 않습니다. 정상적인가요? 내가 더 기대할 수 있을까? – Eloar

2

내 자신의 AppWidgetProvider에 브로드 캐스트 인 텐트를 사용하여이 문제를 해결했습니다. onReceive에서 확인하는 자체 Action이 있습니다. 그런 다음 패키지 이름, 클래스 이름 및 데이터 ID에 대한 매개 변수로 fillInIntent를 설정합니다. onReceive 메서드에서 이것을 사용하여 ListActivity의 의도와 정확히 일치하는 새로운 인 텐트를 만들 수 있습니다. 서비스에서

다음의 AppWidgetProvider에서

Intent intent = new Intent(); 
intent.putExtra(StreamsWidgetProvider.BROADCAST_PARAM_ITEM_ID, item.getId()); 
AccountType at = item.getAccountType(); 
intent.putExtra(StreamsWidgetProvider.BROADCAST_PARAM_CLASS_NAME, at.getViewStreamItemActivity()); 
intent.putExtra(StreamsWidgetProvider.BROADCAST_PARAM_PACKAGE_NAME, at.getPackageName()); 

rv.setOnClickFillInIntent(R.id.streamItemRowId, intent); 

:

public static final String ACTION_START_ACTIVITY = "startActivity"; 
public static final String BROADCAST_PARAM_ITEM_ID = "intentId"; 
public static final String BROADCAST_PARAM_PACKAGE_NAME = "intentPackage"; 
public static final String BROADCAST_PARAM_CLASS_NAME = "intentClassName"; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    final int N = appWidgetIds.length; 

    for (int i=0; i<N; i++) { 
     int appWidgetId = appWidgetIds[i]; 

     RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 

     ... 

     Intent intent = new Intent(context, StreamsWidgetProvider.class); 
     intent.setAction(ACTION_START_ACTIVITY); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
     views.setPendingIntentTemplate(R.id.streamItemsList, pendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(ACTION_START_ACTIVITY.equals(intent.getAction())) { 
     long itemId = intent.getLongExtra(BROADCAST_PARAM_ITEM_ID, 0); 
     String packageName = intent.getStringExtra(BROADCAST_PARAM_PACKAGE_NAME); 
     String className = intent.getStringExtra(BROADCAST_PARAM_CLASS_NAME); 

     Intent i = new Intent(Intent.ACTION_VIEW); 
     i.setData(ContentUris.withAppendedId(StreamItems.CONTENT_URI, itemId)); 
     i.setComponent(new ComponentName(packageName, className)); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     context.startActivity(i); 
    } 

    super.onReceive(context, intent); 
} 
+0

이 모든 것이 필요하지 않습니다. 아래 내 대답을 참조하십시오. –