0

私はまだ Java で Android 向けのプログラミングを学ぶ最初のステップにいます。私の質問は、経験豊富なプログラマーにとっては明らかかもしれませんが、実際に役立つものや具体的な例は見つかりませんでした。

とにかく、私はウィジェットを持っています。Android:updatePeriodMillis が発生したため、 onUpdate が呼び出されたときに通知を送信したいと考えています。setOnClickPendingIntent を使用してボタンをクリックしたときに通知を受け取る方法を知っています。しかし、タイマーが切れたときにのみそれを行う方法がわかりません。

私のコードの一部:

@Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Toast.makeText(context, "onUpdate", Toast.LENGTH_SHORT).show();
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.activity_app_widget);
        Intent configIntent = new Intent(context, FrontPage.class);
        configIntent.setAction(ACTION_WIDGET_CONFIGURE);
        Intent active = new Intent(context, AppWidget.class);
        active.setAction(ACTION_WIDGET_RECEIVER);
        active.putExtra("msg", "Message for Button 1");

        Intent activeButtonTwo = new Intent(context, AppWidget.class);
        activeButtonTwo.setAction(ACTION_WIDGET_RECEIVER2);
        activeButtonTwo.putExtra("msg", "Message for Button 2");

        Intent updateNotification = new Intent (context, AppWidget.class);
        updateNotification.setAction(ACTION_UPDATE);

        PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0);
        PendingIntent actionPendingIntent2 = PendingIntent.getBroadcast(context, 0, activeButtonTwo, 0);
        PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);

        remoteViews.setOnClickPendingIntent(R.id.buttonPrevious, actionPendingIntent);
        remoteViews.setOnClickPendingIntent(R.id.buttonNext, actionPendingIntent2 );
        remoteViews.setOnClickPendingIntent(R.id.buttonGoToApp, configPendingIntent);





        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);

    }

そして、ここに私の onReceive() があります:

@Override    
public void onReceive(Context context, Intent intent)
        {   

            // v1.5 fix that doesn't call onDelete Action
                    final String action = intent.getAction();
                    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
                        final int appWidgetId = intent.getExtras().getInt(
                                AppWidgetManager.EXTRA_APPWIDGET_ID,
                                AppWidgetManager.INVALID_APPWIDGET_ID);
                        if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
                            this.onDeleted(context, new int[] { appWidgetId });
                        }
                    } else {
                        // check, if our Action was called
                        if (intent.getAction().equals(ACTION_WIDGET_RECEIVER) || intent.getAction().equals(ACTION_WIDGET_RECEIVER2)) {
                            String msg = "null";
                            try {
                                msg = intent.getStringExtra("msg");
                            } catch (NullPointerException e) {
                                Log.e("Error", "msg = null");
                            }
                            Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();

                            PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
                            NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
                            Notification noty;
                            if(intent.getAction().equals(ACTION_WIDGET_RECEIVER)){
                                noty = new Notification(R.drawable.ic_launcher, "Button 1 clicked", System.currentTimeMillis());
                            }
                            else
                            {
                                noty = new Notification(R.drawable.ic_launcher, "Button 2 clicked", System.currentTimeMillis());
                            }
                            noty.setLatestEventInfo(context, "Notice", msg, contentIntent);
                            notificationManager.notify(1, noty);

                        } else {
                            // do nothing
                        }

                        super.onReceive(context, intent);
                    }
    }

長い話を短くするために、タイマーが経過したときにのみ、特定のインテントを onReceive メソッドに送信したいと考えています。

前もって感謝します :)

4

1 に答える 1

0

デバイスがスリープしているときに更新したくない場合は、AlarmManagerを使用することをお勧めします。(http://developer.android.com/guide/topics/appwidgets/index.htmlを参照してください)たとえば、次のようになります。

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis() + YOUR_UPDATE_INTERVAL,
                YOUR_UPDATE_INTERVAL, intent);  

インテントは、アクションを設定したPendingIntentです。

于 2012-11-06T13:47:05.973 に答える