2013-06-28 2 views
0

У меня есть виджет с 3 разных кнопки, которые содержат некоторые значения, которые я получаю из своей базы данных.значения кнопки обновления виджета в главном приложении

Когда база данных обновляется в основном приложении, мне нужны кнопки в виджетах , чтобы получить обновленные значения из моей базы данных, а затем отобразить их.

Я хотел бы назвать обновление на кнопках, когда onStop вызывается в основного приложения, но я просто не могу понять, как это сделать.

Любые suggesteons будут оценены :)

@Override 
protected void onStop() 
{ 
//main application 

    .super.onStop(); 
    WidgetProvider.updateMyWidgets(null, null); // does obviously not work as i dont have Context or Parcelable to send with it 
    dblose(); 
} 

public static void updateMyWidget(Context context, Parcelable data) 
{ 
    AppWidgetManager man = AppWidgetManager.getInstance(context); 
    int[] ids = man.getAppWidgetIds( new ComponentName(context, WidgetProvider.class)); 
    Intent updateIntent = new Intent(); 
    updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
    updateIntent.putExtra(WidgetProvider.ACTION_WIDGET_BUTTON1, data); 
    updateIntent.putExtra(WidgetProvider.ACTION_WIDGET_BUTTON2, data); 
    updateIntent.putExtra(WidgetProvider.ACTION_WIDGET_BUTTON3, data); 
    context.sendBroadcast(updateIntent); 
} 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
{ 
    Log.w("no.reaving", "onUpdate method called"); 
    getTimeFromDatabase(); 

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

    Intent active = new Intent(context, WidgetProvider.class); 
    active.setAction(ACTION_WIDGET_BUTTON1); 
    PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 1, active, PendingIntent.FLAG_CANCEL_CURRENT); 
    remoteViews.setOnClickPendingIntent(R.id.btnTimerWidget1, actionPendingIntent); 

    active = new Intent(context, WidgetProvider.class); 
    active.setAction(ACTION_WIDGET_BUTTON2); 
    actionPendingIntent = PendingIntent.getBroadcast(context, 2, active, PendingIntent.FLAG_CANCEL_CURRENT); 
    remoteViews.setOnClickPendingIntent(R.id.btnTimerWidget2, actionPendingIntent); 

    active = new Intent(context, WidgetProvider.class); 
    active.setAction(ACTION_WIDGET_BUTTON3); 
    actionPendingIntent = PendingIntent.getBroadcast(context, 3, active, PendingIntent.FLAG_CANCEL_CURRENT); 
    remoteViews.setOnClickPendingIntent(R.id.btnTimerWidget3, actionPendingIntent); 

    // Set the text with the current time. 
    remoteViews.setTextViewText(R.id.btnTimerWidget1, TESTSTRING1 + " Hrs"); 
    remoteViews.setTextViewText(R.id.btnTimerWidget2, TESTSTRING2 + " Hrs"); 
    remoteViews.setTextViewText(R.id.btnTimerWidget3, TESTSTRING3 + " Hrs"); 

    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
} 


@Override 
public void onReceive(Context context, Intent intent) 
{ 
    WidgetProvider.context = context; 
    db = new DatabaseHandler(context); 
    getTimeFromDatabase(); 

    if (intent.getAction().equals(ACTION_WIDGET_BUTTON1)) { 
     newAlarm(TESTSTRING1); 
     showToast(TESTSTRING1); 
    } else if (intent.getAction().equals(ACTION_WIDGET_BUTTON2)) { 
     newAlarm(TESTSTRING2); 
     showToast(TESTSTRING2); 
    } else if (intent.getAction().equals(ACTION_WIDGET_BUTTON3)) { 
     newAlarm(TESTSTRING3); 
     showToast(TESTSTRING3); 
    } else { 
     super.onReceive(context, intent); 
    } 
} 
+0

какой ошибка-х вы получаете? –

+0

RuntimeException: невозможно остановить активность MainOpeningActivity. Я просто думаю, что должен быть лучший способ, а затем вызвать его статически, например, с широковещательным приемником, как указано ниже, но я не знаю, как использовать широковещательный приемник. – Reaver

ответ

0

AppWidgetProvider extends BroadcastReceiver так, когда значение обновляется, вы можете отправить намерение вашей реализации AppWidgetProvider

Редактировать В главном приложении вместо от

WidgetProvider.updateMyWidgets(null, null);

вы отправляете broastcast ваших WidgetProvider и осуществить обновление в методе onReceive

Смотрите эту project, если это может помочь вам

+0

Не могли бы вы показать мне небольшой код о том, как я мог это сделать? что? Мне еще нужно использовать BroadcastReceiver, поэтому я не понимаю его полностью – Reaver