AppWidgetでサービスが動作しない

667 views
Skip to first unread message

たくや

unread,
Dec 5, 2012, 8:07:15 AM12/5/12
to android-g...@googlegroups.com
いつもお世話になっております。 たくやと申します。
 
ただ今Androidの開発の自己学習を兼ねて、AppWidgetでクリック自に画像を変更するウィジェットを作成しようとしています。
AppWidgetProviderを継承したMainという名称のクラスで、onUpdateをオーバーライドし、その中でサービスを呼び出しています。
そのサービスの中でRemoteViewsを作成しimageViewのソースを変更しようとしていますが、全く動きません。
実機でデバックしているのですが、ウィジェットは正常にインストールされホーム画面に配置はできるのですが、クリックしても望んだ動作(画像変更)はしてくれません。
 
質問は3つです。
 
①ウィジェットはブレークポイントで止めて確認はできないのでしょうか?
できるのであれば方法を、できないのであれば何か代わりになるような方法があればお願いします。
私の知識不足なのでしょうが、中の動きが不明すぎてちゃんと意図した通りに流れているか確認できれば、と思っています。
 
②以下にソースを貼り付けますので、お時間がある方は是非どこが悪いのか指摘していただくと助かります。
 
③こういう場合は添付ファイルにしたほうがよいですか?
 
質問が長くなってしまし申し訳ありません。
Main.java(エラー・警告なし)
AndroidManifest.xml(エラー・警告なし)
res/layout/main.xml(エラー・警告なし)
res/xml/widget.xml(エラー・警告なし)
 
 
 
Main.java(エラー・警告なし)
 
package com.appwidget.appwidget;
importは省略します。
public class Main extends AppWidgetProvider {
 static int index = 0;
 static int[] images = {
  R.drawable.g0,
  R.drawable.g1,
 };
 private static final String ACTION_MY_CLICK = "com.appwidget.appwidget.Main.ACTION_MY_CLICK";
 
 @Override
 public void onUpdate(Context context,AppWidgetManager appWidgetManager, int[] appWidgetIds){
  super.onUpdate(context, appWidgetManager, appWidgetIds);
  Intent serviceIntent = new Intent(context, MyService.class);
  context.startService(serviceIntent);
 }
 
 public static class MyService extends Service{
  @Override
  public void onStart(Intent intent, int startId){
   Intent onClick = new Intent();
   onClick.setAction(ACTION_MY_CLICK);
   PendingIntent pendingIntent = PendingIntent.getService(this, 0, onClick, 0);
   
   RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.main);
   remoteViews.setOnClickPendingIntent(R.id.imageView1, pendingIntent);
   
   if(ACTION_MY_CLICK.equals(intent.getAction())){
    remoteViews.setImageViewResource(R.id.imageView1, images[index]);
    index = ++index % images.length;
   }
   
   ComponentName thisWidget = new ComponentName(this,Main.class);
   AppWidgetManager manager = AppWidgetManager.getInstance(this);
   manager.updateAppWidget(thisWidget, remoteViews);
  }
  @Override
  public IBinder onBind(Intent intent) {
   // TODO 自動生成されたメソッド・スタブ
   return null;
  }
 }
}
 
 
AndroidManifest.xml(エラー・警告なし)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.appwidget.appwidget"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="15" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/btn_rating_star_off_pressed"
        android:label="@string/app_name">
    <receiver android:name=".Main" android:label="AppWidet">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter> 
        <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" />
    </receiver>
    <service android:name="Main$MyService">
  <intent-filter>
   <action android:name="com.appwidget.appwidget.Main.ACTION_MY_CLICK" />
  </intent-filter>
 </service>
    </application>
</manifest>
 
 
res/layout/main.xml(エラー・警告なし)
ImageViewにsrcを指定しているのは、指定しないとホームに設置したときアイコンなしで設置されてしまうためです。
この指定を外しても動作はしませんでした。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  android:id="@+id/LinearLayout01"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical">
 <ImageView
  android:id="@+id/imageView1"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent"
  android:gravity="center"
  android:contentDescription="@string/test"
  android:src="@drawable/btn_rating_star_off_pressed"/>
</LinearLayout>

res/xml/widget.xml
<?xml version="1.0" encoding="utf-8"?>
 <appwidget-provider 
     xmlns:android="http://schemas.android.com/apk/res/android
     android:minWidth="72dip" 
     android:minHeight="72dip" 
     android:updatePeriodMillis="0" 
     android:initialLayout="@layout/main"
 />
 
 
main.xml
widget.xml
AndroidManifest.xml
Main.java

kacodama

unread,
Dec 5, 2012, 7:20:36 PM12/5/12
to android-g...@googlegroups.com
他は分かりませんが、これだk。

>①ウィジェットはブレークポイントで止めて確認はできないのでしょうか?

ウィジェットのプロセスがDDMSで見えていれば、アタッチボタンを押した後なら
ブレークで止まってくれたように思います。

2012年12月5日水曜日 22時07分15秒 UTC+9 たくや:

田代透

unread,
Dec 5, 2012, 10:24:16 PM12/5/12
to android-g...@googlegroups.com

たとえブレークポイントで止まらなくても、要所要所でログに出力するといった方法で、流れを追ったり呼び出しパラメータが正しいかなど確認すら事はできます。
そもそも、ブレークポイントで止まらないではなくそこまで到達していないのかも

ソースを丸投げしてただでデバッグという仕事をしてもらおうというのは、どうなんでしょう?

2012/12/05 22:07 "たくや" <ayukat09...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/D9t9WpIZYasJ にアクセスしてください。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

MORIHIRO

unread,
Dec 6, 2012, 12:03:46 AM12/6/12
to android-g...@googlegroups.com
添付されているコードですが、GalaxyNexus(Android4.1.2)では
正常動作しましたので、もしかしたらEclipseのProject/Cleanを実行して
R.javaを更新してやればちゃんと動作するようになりませんか?

2012年12月5日水曜日 22時07分15秒 UTC+9 たくや:

たくや

unread,
Dec 6, 2012, 5:50:31 AM12/6/12
to android-g...@googlegroups.com
kacodama さん
 
返信ありがとうございます。
 
DDMS自体を知りませんでした。ありがとうございます。
 
DDMSでもWidgetは止まってくれないようなのですが、、、
そもそもアタッチボタンとはどんなボタンでしょうか?
 
DDMSはEclipseで起動するとアタッチできないのでしょうか?
 
回答の質問になってしまい申し訳ありません。

2012年12月6日木曜日 9時20分36秒 UTC+9 kacodama:

たくや

unread,
Dec 6, 2012, 5:54:16 AM12/6/12
to android-g...@googlegroups.com
Toru  さん
 
>たとえブレークポイントで止まらなくても、要所要所でログに出力するといった方法で、流れを追ったり呼び出しパラメータが正しいかなど確認すら事はできます。
>そもそも、ブレークポイントで止まらないではなくそこまで到達していないのかも
おっしゃる通りですね。今後の参考にさせていただきます。ありがとうございます。
 
 
>ソースを丸投げしてただでデバッグという仕事をしてもらおうというのは、どうなんでしょう?
このことに関しては、弁明のしようもございません。私もどうかと思います。
ですが、今回はどこが悪いのか見当もつきませんでしたのでこのような質問をしてしまいました。
以後気をつけたいと思います。申し訳ありませんでした。
 
 

2012年12月6日木曜日 12時24分16秒 UTC+9 Toru:

たとえブレークポイントで止まらなくても、要所要所でログに出力するといった方法で、流れを追ったり呼び出しパラメータが正しいかなど確認すら事はできます。
そもそも、ブレークポイントで止まらないではなくそこまで到達していないのかも

ソースを丸投げしてただでデバッグという仕事をしてもらおうというのは、どうなんでしょう?

 
 

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/D9t9WpIZYasJ にアクセスしてください。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
Message has been deleted

たくや

unread,
Dec 6, 2012, 6:19:31 AM12/6/12
to android-g...@googlegroups.com
MORIHIRO さん
動作確認ありがとうございます。
今まで実機(F-05D Android4.0.3)で動作確認を行っていたのですが、もしかしてと思い試しにエミュレータで4.0.3の仮想デバイスで起動してみたところ何の問題もなく動作しました。。。試しに、マニフェストの
    <uses-sdk  android:minSdkVersion="15 android:targetSdkVersion="15" />
 <uses-sdk android:minSdkVersion="3" />
とかにも変更してみたのですが、状況はかわりませんでした。
 
>正常動作しましたので、もしかしたらEclipseのProject/Cleanを実行して
これはデバックするたびに毎回するようにしています。ありがとうございます。
これは私のスマホが悪いのでしょうか?それともF-05Dでウィジェットを動作させるためには何か必要なのでしょうか?
ちなみに普通のアプリはちゃんとデバックできます。
2012年12月6日木曜日 14時03分46秒 UTC+9 MORIHIRO:

MORIHIRO

unread,
Dec 6, 2012, 7:53:21 AM12/6/12
to android-g...@googlegroups.com
問題があるとしたら端末依存というよりもLauncherアプリによると思います。

手元に再現環境がないのであとは推測しかできませんが、
タッチしたタイミングで、"ACTION_MY_CLICK" のintentは
発行されているのでしょうか?
(デバッグログを追加すれば確認できると思います)

intentが発行されているとしたら、
  remoteViews.setImageViewResource()
でエラーとかは出力されていないでしょうか?

2012年12月6日木曜日 20時19分31秒 UTC+9 たくや:
Message has been deleted

kacodama

unread,
Dec 6, 2012, 7:26:34 PM12/6/12
to android-g...@googlegroups.com
eclipseのADTに含まれるDDMSでアタッチできますよ。

起動済みプロセスへのアタッチは、Devicesウィンドウで目的のデバイスを選び、
その下に表示される目的のプロセスを選んだ後、緑色のゾウリムシみたいなボタンを
押すとアタッチできます。
マニフェストファイルのdebuggable=trueになっている必要があります。

ただ、すみません、私もあやふやなのですが、もしかしたらウィジェットはできなかったかも・・・
ウィジェット作ったのがずいぶん前なのでうろ覚えです。すみません。


2012年12月6日木曜日 19時50分31秒 UTC+9 たくや:

たくや

unread,
Dec 7, 2012, 7:44:27 AM12/7/12
to android-g...@googlegroups.com
kacodama 
 
返信ありがとうございます。
 
ウィジェットではできないようです。
 
ありがとうございました。

2012年12月7日金曜日 9時26分34秒 UTC+9 kacodama:

長田努

unread,
Dec 7, 2012, 8:15:52 AM12/7/12
to android-g...@googlegroups.com
たくやさん、こんばんは。長田と申します。

kacodamaさんのフォローになると思いますが…

Widgetにデバッガーを使う際にwaitForDebugger()は利用できませんでしょうか?


こちらの指定にはdebuggable=trueが必要となりますが、昨今のeclipse開発環境であればデバッグ実行で自動的にdebuggable=trueになるはずです。(記述の必要が無いと言われるので)

waitForDebugger()を記述する事で任意にデバッガーを待ってくれると思います。
ブレイクポイントの直前に置く事で有効性を発揮するでしょう。

求めている答えと違う 的外れな発言でしたら申し訳ありません。

長田


2012年12月7日 21:44 たくや <ayukat09...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/ucHy2qUrgbgJ にアクセスしてください。

このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

たくや

unread,
Dec 8, 2012, 6:48:39 AM12/8/12
to android-g...@googlegroups.com
TOsada 
 
情報ありがとうございます。
 
>Widgetにデバッガーを使う際にwaitForDebugger()は利用できませんでしょうか。
利用可能でした。
 
上記を利用して、すべて止めながらみたところなぜか普通に動くようになりました。
 
ありがとうございます。
 

2012年12月7日金曜日 22時15分52秒 UTC+9 TOsada:

このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

たくや

unread,
Dec 8, 2012, 6:55:58 AM12/8/12
to android-g...@googlegroups.com
MORIHIRO  
 
返信ありがとうございます。
 
ログを出力してみようとしたところ、急にエミュレータでも起動しなくなり、RemoteViewsのの箇所でおちるようになりました。
 
ComponentNameやその他のクラス作成の順番を変更したらなんの問題もなく動くようになってしまいました。
 
最終的に再現できなくなったので原因不明ですが、1週間ありがとうございました。
 
一応、最終的に作成したファイルを添付しておきます。
 
また、何かありましたらよろしくお願いいたします。

2012年12月6日木曜日 21時53分21秒 UTC+9 MORIHIRO:
Main.java
main.xml
widget.xml
AndroidManifest.xml

たくや

unread,
Dec 9, 2012, 5:20:08 AM12/9/12
to android-g...@googlegroups.com
皆様
 
前回で一応の解決は見ましたが、すっきりせずに終わっていました。
 
その後違う処理を組み込み、動かしたところ動いたり動かなかったり・・・・
 
自分なりに調査してみたことろ、私の目が節穴だったようでLogCatで散々ワーニングが出力されていました。
 
内容
Unable to launch app com.appwidget.appwidget/10042 for broadcast Intent { act=android.appwidget.action.APPWIDGET_ENABLED flg=0x10 cmp=com.appwidget.appwidget/.Main }: process is bad
 
「com.appwidget.appwidget/.Main 」が起動できないと言っていました。。。
 
その後このワーニングをもとに調査したところ、端末が不安定だとこのメッセージが出力されるようでした。
ググルと同じ症状の方がたくさんおられました。
 
ですが、みなさん共通しているのは誰も根本的な解決策が存在していないということ。
実際私もエミュレーターでも起動しなかったり起動したり、実機でも起動したりしなかったり、、、
一旦起動さえしてしまえば、ホーム画面から削除・再配置を行っても動くですが、updateして再度デバックしようとするとまた上記のワーニングを吐いて動かなかったり、、、
かといって、全ソースを元に戻しても動いたり動かなかったり、、、
 
ちなみに、上記のワーニングを吐いて起動しなくなるとjava自体が全く呼ばれていない状態になりログ出力や「android.os.Debug.waitForDebugger();」はもちろん動かないので自分では解決策は得られませんでした。
 
上記ワーニングについて解決策や参考サイトをご存じの方がおられましたらよろしくお願いいたします。

MORIHIRO

unread,
Dec 9, 2012, 9:04:12 AM12/9/12
to android-g...@googlegroups.com
再現環境がないので適当に書きますが、
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
を追加しても状況は変わりませんか?

android - Launching activity from widget - Stack Overflow
http://stackoverflow.com/questions/1937236/launching-activity-from-widget

2012年12月9日日曜日 19時20分08秒 UTC+9 たくや:
Reply all
Reply to author
Forward
0 new messages