1

私のアプリケーション用のウィジェットを作成していますが、動作を拒否しています。 このウィジェットは、作成時に設定アクティビティを起動し、クリックすると作成したIntentServiceを開始します。 それをクリックすると、サービスが開始されません!この未決の意図をGoogleを立ち上げる意図に変更しようとしましたが、それは機能します。ウィジェットはクリックされたときにサービスを起動しません

いくつかのコード:

AppWidgetProviderのXML

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:configure="com.eladaharon.android.lary.widget.LaryWidgetConfigurationActivity" 
    android:initialLayout="@layout/widget_1x1" 
    android:minHeight="72dp" 
    android:minWidth="72dp" 
    android:updatePeriodMillis="86400000" > 

</appwidget-provider> 

マニフェスト宣言

<activity 
      android:name=".widget.LaryWidgetConfigurationActivity" 
      android:configChanges="orientation|keyboard" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> 
      </intent-filter> 
     </activity> 

     <service android:icon="@drawable/icon" android:enabled="true" android:name="widget.LaryWidgetCheckService" /> 

     <!-- Broadcast Receiver that will process AppWidget updates --> 
     <receiver android:name=".widget.LaryWidgetProvider" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
       <action android:name="android.appwidget.action.APPWIDGET_DELETED" /> 
       <action android:name="android.appwidget.action.APPWIDGET_ENABLED" /> 
       <action android:name="android.appwidget.action.APPWIDGET_DISABLED" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/widget_provider" /> 
     </receiver> 

AppWidgetProviderクラス

コンフィギュレーション・アクティビティ・エンド

private Handler mHandler = new Handler(){ 

     @Override 
     public void handleMessage(Message msg){ 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(LaryWidgetConfigurationActivity.this); 
      LaryWidgetProvider.updateAppWidget(LaryWidgetConfigurationActivity.this, appWidgetManager, 
        mAppWidgetId); 

      // Make sure we pass back the original appWidgetId 
      Intent resultValue = new Intent(); 
      resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); 
      setResult(RESULT_OK, resultValue); 
      finish(); 
     } 
    }; 

私は事前にクリック

public class LaryWidgetCheckService extends IntentService { 
    private int mAppWidgetId; 

    public LaryWidgetCheckService(String name) { 
     super("WorkplaceService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      mAppWidgetId = extras.getInt(
        AppWidgetManager.EXTRA_APPWIDGET_ID, 
        AppWidgetManager.INVALID_APPWIDGET_ID); 
     } 

     // If they gave us an intent without the widget id, just bail. 
     if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { 
      return; 
     } 

     // Running some code 
    } 

} 

おかげで実行するサービス上で呼び出されていることを

public class LaryWidgetProvider extends AppWidgetProvider { 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 

     // Perform this loop procedure for each App Widget that belongs to this provider 
     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

      // Create an Intent to launch service 
      Intent intent = new Intent(context, LaryWidgetCheckService.class); 
      intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
      PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

      // Get the layout for the App Widget and attach an on-click listener 
      // to the button 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_1x1); 
      views.setOnClickPendingIntent(R.id.widget_check_button, pendingIntent); 

      // Tell the AppWidgetManager to perform an update on the current app widget 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    } 

    public void onEnabled(Context context) { 
     PackageManager pm = context.getPackageManager(); 
     pm.setComponentEnabledSetting(
       new ComponentName("com.eladaharon.android.lary.widget", 
         ".SalaryWidgetConfigurationActivity"), 
         PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
         PackageManager.DONT_KILL_APP); 
    } 

    public void onDisabled(Context context) { 
     PackageManager pm = context.getPackageManager(); 
     pm.setComponentEnabledSetting(
       new ComponentName("com.eladaharon.android.lary.widget", 
         ".LaryWidgetConfigurationActivity"), 
         PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
         PackageManager.DONT_KILL_APP); 
    } 

    public void onDeleted(Context context, int[] appWidgetIds) 
    { 
     Editor edit = context.getSharedPreferences(Constants.PREFERNCES_WIDGET_PREFERENCES, Context.MODE_PRIVATE).edit(); 
     final int N = appWidgetIds.length; 
     for (int i=0; i<N; i++) 
     { 
      edit.remove(String.valueOf(appWidgetIds[i])); 
     } 
     edit.commit(); 
    } 

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
      int appWidgetId) { 

     // Create an Intent to launch service 
     Intent intent = new Intent(context, LaryWidgetCheckService.class); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

     // Get the layout for the App Widget and attach an on-click listener 
     // to the button 
     RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_1x1); 
     views.setOnClickPendingIntent(R.id.widget_check_button, pendingIntent); 

     // Tell the AppWidgetManager to perform an update on the current app widget 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 

} 

ハンドラ!!

答えて

3

私はこの世界が嫌いです! マニフェストをもう一度見てみると、私がwgetget.SERVICENAMEの代わりにwidget.SERVICENAMEを書いたことに気づくでしょう!

私はこの1日を過ごしました!

お手数をおかけしていただきありがとうございます。

+0

私はそれも嫌いです。あなたと同じようなミスを犯しました。しかし、少なくとも私は半日を失った! – MiloRambaldi

0

ウィジェットは別のプロセスで実行され、アプリケーション内でのみ動作する明示的なインテントを送信しています。なぜこれが放送受信機を含む別のタイプの意図であり、誰かが応答するかどうかを見るためにシステム全体に広がっているからです。

私はあなたのサービスで放送受信機を宣言し、あなたのウィジェットからそのインテントを発射する必要があると思います。

+0

私は自分のアプリからのアクティビティでサービスを置き換えようとしましたが、それはうまく動作するので、あなたが言ったこととは何の関係もないと思います: 'Intent intent = new Intent(context、ChooseActivity.class); \t \t intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID、appWidgetId); \t \t PendingIntent pendingIntent = PendingIntent.getActivity(context、0、intent、0); ' – Elad92

関連する問題