2017-03-10 16 views
0

私はボタンを押すとサービスにブロードキャストを送信するウィジェットがあります。しかし、私はonReceive()に放送を受信して​​いません。Android放送はウィジェットから受信されていません

私の意図は、基本的にはウィジェットのボタンをクリックすることです。サービスを実行して何らかのアクションを実行します。 しかし、サービス中のウィジェットからのブロードキャストを受信できません。ここで

は私のウィジェットコードである - MyServiceでは

@Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
         int[] appWidgetIds) { 
     RemoteViews remoteViews; 
     ComponentName componentName; 

     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     componentName = new ComponentName(context, MyWidgetProvider.class); 

     remoteViews.setOnClickPendingIntent(R.id.play,getPendingSelfIntent(context, "PLAY",componentName)); 

     appWidgetManager.updateAppWidget(componentName, remoteViews); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     super.onReceive(context, intent); 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     RemoteViews remoteViews; 
     ComponentName componentName; 

     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     componentName = new ComponentName(context, MyService.class); 

     if (intent.getAction().equals("PLAY")) { 
      Log.d("hi","PLAY0"); 
      remoteViews.setOnClickPendingIntent(R.id.engine_lock_unlock,getPendingSelfIntent(context,"PLAY",componentName)); 
      serviceIntent = new Intent(context,MyService.class); 

      serviceIntent.setAction("PLEASE_PLAY"); 
      Log.d("hi","PLAY1"); 
      context.sendBroadcast(serviceIntent); 
     } 


     appWidgetManager.updateAppWidget(componentName, remoteViews); 
    } 

    protected PendingIntent getPendingSelfIntent(Context context, String action, ComponentName componentName) { 
     Intent intent = new Intent(context, MyWidgetProvider.class); 
     intent.setAction(action); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, componentName); 
     return PendingIntent.getBroadcast(context, 0, intent, 0); 
    } 

public class ServiceWidgetReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
     Log.d("hi","PLAY2"); 

      if (intent.getAction().equals("PLEASE_PLAY")) { 

      } 
     } 
} 

私のマニフェストはこのようになります -

<receiver android:name=".widget.MyWidgetProvider" > 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 

    <meta-data android:name="android.appwidget.provider" 
       android:resource="@xml/homescreen_widget_preview" /> 
</receiver> 
<receiver android:name=".service.MyService$ServiceWidgetReceiver" /> 

私だけのログを取得する -

PLAY0 
PLAY1 

なぜ私は自分の放送を入手しないのですか?

答えて

0

受信者がインテントフィルターを提供していない継ぎ目。あなたのmainfestファイルでこれを追加しよう:

<receiver android:name=".service.MyService$ServiceWidgetReceiver"> 
    <intent-filter> 
     <action android:name="PLEASE_PLAY" /> 
    </intent-filter> 
</receiver> 
+0

チェックされても動作しませんでした:( – MagdHo0506

0

私はあなたがMYONが言ったようにインテントフィルタでアクションを実装していることを前提としませんが、onReceiveにまだ放送。あなたはこの試みることがあります。

protected PendingIntent getPendingSelfIntent(Context context, String action, ComponentName componentName) { 
    Intent intent = new Intent(context, MyWidgetProvider.class); 
    intent.setAction(action); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, componentName); 

    //this line replace the original 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 

を実際に、私は私のアンドロイド5.1の携帯電話に私のウィジェットは正常に動作することを昨日同様の問題に直面しています。しかし、私はアンドロイド7.0のソニーの携帯電話をクリックすることはできません見つける。 7.0やそれ以降のアップグレード後に、APIでかなり多くの変更が加えられたので、多くの異なる問題が出現しているので、私はまだソニーの電話の問題かAndroidの問題かどうかを調べようとしています。とにかく、私はPendingIntent.FLAG_UPDATE_CURRENTを使って、私が持っている問題を解決しました。

私はちょうどこれが動作するようにレシーバクラスを直接登録すると思います。バインドされたサービスは、受信者に影響を与えるのはコンテキストだけであるため、受信に直接影響しません。だから、おそらく受信クラスで十分です。

<receiver android:name="packageName.ServiceWidgetReceiver"> 
    <intent-filter> 
     <action android:name="PLEASE_PLAY" /> 
    </intent-filter> 
</receiver> 
+0

まだ動作しません:(Android 7の問題では、ブロードキャストレシーバーは、マニフェストではなくonCreateとonDestroyに登録してください) – MagdHo0506

+0

実際には、 onclickメソッドのためのものです。それは余分なサービスではないので、私はonUpdateにUIコンポーネントを登録する方法をお勧めします.Btw、Loggedの行から来た最新ですLogged 、 "PLAY0"); Log.d( "hi"、 "PLAY1");? – CbL

+0

はい、ログはそこから来ています – MagdHo0506

0

私がやっていた間違いを見つけました。私はレシーバを登録し、マニフェストではなくサービス自体を登録解除しなければなりませんでした。 これは私のために働いた。