2017-10-24 11 views
1

appwidgetの作成中に問題が発生しました。 AlarmManagerをに更新しました私のウィジェット15分ごとにを更新しました。残念ながら、BroadcastReceiverの私の実装では、は受信されないため、Toastメッセージは表示されません。AlarmManagerは繰り返しを設定しますが、BroadcastReceiverはアラームを受信しません。

私はここやGoogleで配信される多くの類似の問題と解決策を考えました。私が書いたことはすべて、チュートリアル、人の回答、およびその他のドキュメントに正確に合っているようです。私は小さなバグを作ったに違いないか、何かを誤解していたに違いないが、ここで何が間違っているかは本当に分かりません。

私は下に貼り付けたコードを見てとても親切ですか?

のAndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="pl.test.mywidget" 
    android:versionCode="1" 
    android:versionName="1.0"> 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 


    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity 
      android:name=".view.MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 

     <receiver android:name=".view.LmWidgetProvider" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 
      <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info" /> 
     </receiver> 

     <receiver android:name=".service.WidgetUpdateService"/> 

     <receiver android:name=".service.DeviceBootReceiver" 
        android:enabled="false"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      </intent-filter> 
     </receiver> 

    </application> 
</manifest> 

MyWidgetProvider.java

@Override 
public void onDisabled(Context context) { 
    final Intent intent = new Intent(context, WidgetUpdateService.class); 
    final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0); 
    final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    alarm.cancel(pending); 
    super.onDisabled(context); 
} 

@Override 
public void onEnabled(Context context) { 
    super.onEnabled(context); 
    final Intent intent = new Intent(context, WidgetUpdateService.class); 
    final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0); 
    final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    int widgetRefreshInterval = 1000 * 60 * 1; //1 minute just for tests 
    alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000, widgetRefreshInterval, pending); 
    //alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000, widgetRefreshInterval, pending); 
} 

WidgetUpdateService.java

public class WidgetUpdateService extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "WidgetUpdateService", Toast.LENGTH_SHORT).show(); 
    } 

} 
+1

あなたの保留中の意図は以下のようになります.. PendingIntent.getBroadcast(context、0、intent、PendingIntent.FLAG_UPDATE_CURRENT); –

+0

私はそれがどこかに隠されたちょっとしたボガートでなければならないことを知っていました...私はそれを見て数時間後に盲目です。あなたが正しい。どうもありがとうございました! – mariachi

答えて

1
はあなたに保留意向を変更

PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

PendingIntent.FLAG_UPDATE_CURRENT:説明PendingIntentがすでに存在している場合、それを維持したが、この新しいインテントにあるもので、その余分なデータを交換することを示すフラグ

getBroadcast: Context.sendBroadcast()を呼び出すのと同様に、ブロードキャストを実行するPendingIntentを取得します。

のgetService: はContext.startService()を呼び出すように、サービスを開始しますPendingIntentを取得します。

+0

あなたは完全に正しいです!ありがとうございました! – mariachi

関連する問題