2010-09-02 30 views
6

Tôi nhận được một Widget trên Màn hình chính của tôi mà tôi thêm một lần nhấp vào một Nút. Tôi vượt qua id phụ tùng từ Widget cho Dịch vụ, nhưng khi im đọc WidgetId tại Dịch Vụ nó luôn luôn 3.Android: Chuyển AppWidgetId đến một Dịch vụ

Widget:

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

    for (int appWidgetId : appWidgetIds) { 
     RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget); 

     Intent intent = new Intent(context, WidgetService.class); 


     // prints the correct appWidgetId 
     System.out.println(appWidgetId); 


     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

     remoteView.setOnClickPendingIntent(R.id.Button01, pendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetId, remoteView); 
    } 

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

Dịch vụ trông như thế này:

public int onStartCommand(Intent intent, int flags, int startId){ 
    if (intent != null && intent.getExtras() != null) { 

     int widgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); 

     // 3 is always printend 
     System.out.println(widgetId); 

     // More stuff here 

    } 
    return super.onStartCommand(intent, flags, startId); 
} 

Vậy tôi đang làm gì sai?

Trả lời

4

Những gì bạn đang cố gắng làm sẽ không hoạt động, AFAIK, mà không cần một số thủ thuật.

Chỉ có thể có một nổi bật PendingIntent cho mỗi Intent. Vì vậy, nếu bạn tạo hai số Intents tương đương (khớp với dữ liệu không phụ), và bạn cố gắng tạo hai số PendingIntents, bạn thực sự kết thúc với một đơn PendingIntent cuối cùng. Trong đó Intent được sử dụng phụ thuộc một chút vào các cờ bạn cung cấp cho getService() (hoặc getActivity() hoặc getBroadcast()). Trong trường hợp của bạn, Intent đầu tiên sẽ luôn được sử dụng.

Nếu bạn chỉ có một nổi bật PendingIntent nhưng chỉ muốn cập nhật tính năng bổ sung, FLAG_UPDATE_CURRENT sẽ hoạt động. Tuy nhiên, bạn muốn N xuất sắc PendingIntents.

Cách duy nhất tôi biết để thực hiện công việc đó trong trường hợp của bạn là đặt một chuỗi hành động duy nhất trong Intent. Vì bạn đang chỉ định thành phần (WidgetService.class), chuỗi hành động sẽ không được sử dụng để định tuyến. Tuy nhiên, nó sẽ đủ để cung cấp cho bạn nhiều đối tượng PendingIntent.

3

Chỉ cần để thêm vào những nhận xét trên, xem ví dụ này để làm thế nào để làm cho ý định của bạn độc đáo: http://developer.android.com/resources/samples/StackWidget/src/com/example/android/stackwidget/StackWidgetProvider.html Nó có vẻ như một thiết kế thực sự ngớ ngẩn và một workaround thậm chí tồi tệ hơn, nhưng tôi đoán đó là cách nó được. Phải mất một thời gian dài tôi mới tìm được ví dụ đơn giản ở trên. Đặc biệt chú ý đến lệnh gọi intent.setData (Uri). Tôi cắt và dán các dòng đó vào phương thức onUpdate() của tôi và cuối cùng nó đã hoạt động.

+0

Great find. Tôi đã cố gắng giải quyết vấn đề này một thời gian, và tất cả cùng với nó như trong ví dụ cơ bản. Geez. Cảm ơn nhiều! – icecreamman

Các vấn đề liên quan