Thanks all for the help.
This is just a learning project for myself and wont be released on the
Android market. So I am aware that it may not be the best approach but it is
something to learn from.
I have implemented the widget with the following code:
public class WlanWidget extends AppWidgetProvider{
RemoteViews remoteViews;
AppWidgetManager appWidgetManager;
ComponentName thisWidget;
WifiManager wifiManager;
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new WlanTimer(context,
appWidgetManager), 1, 1000);
}
private class WlanTimer extends TimerTask{
RemoteViews remoteViews;
AppWidgetManager appWidgetManager;
ComponentName thisWidget;
public WlanTimer(Context context, AppWidgetManager appWidgetManager) {
this.appWidgetManager = appWidgetManager;
remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget);
thisWidget = new ComponentName(context, WlanWidget.class);
wifiManager =
(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
}
@Override
public void run() {
remoteViews.setTextViewText(R.id.widget_textview,
wifiManager.getConnectionInfo().getSSID());
if((GlobalData.MIN_RSSI_LEVEL -
(Math.abs(wifiManager.getConnectionInfo().getRssi())*2) <= 100)){
remoteViews.setTextViewText(R.id.widget_percentage,
(GlobalData.MIN_RSSI_LEVEL -
(Math.abs(wifiManager.getConnectionInfo().getRssi())*2)+"%"));
}
else
{
remoteViews.setTextViewText(R.id.widget_percentage,
"100%");
}
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
}
}
This appears to work fine but it then seems to make the
android.process.acore crash, it also crashes theandroid.process.acore if I
try to long press on the widget.
I get the following messages in logcat then:
05-31 10:12:49.158: WARN/WindowManager(88): Key dispatching timed out
sending to com.android.launcher/com.android.launcher.Launcher
05-31 10:12:49.168: WARN/WindowManager(88): Dispatch state:
{{KeyEvent{action=1 code=82 repeat=0 meta=0 scancode=139 mFlags=8} to
Window{433114a0 com.android.launcher/com.android.launcher.Launcher
paused=false} @ 1275296936375 lw=Window{433114a0
com.android.launcher/com.android.launcher.Launcher paused=false}
lb=android.os.binderpr...@43311228 fin=false gfw=true ed=true tts=0 wf=false
fp=false mcf=Window{433114a0
com.android.launcher/com.android.launcher.Launcher paused=false}}}
05-31 10:12:49.168: WARN/WindowManager(88): Current state: {{null to
Window{433114a0 com.android.launcher/com.android.launcher.Launcher
paused=false} @ 1275297169174 lw=Window{433114a0
com.android.launcher/com.android.launcher.Launcher paused=false}
lb=android.os.binderpr...@43311228 fin=false gfw=true ed=true tts=0 wf=false
fp=false mcf=Window{433114a0
com.android.launcher/com.android.launcher.Launcher paused=false}}}
05-31 10:12:49.238: INFO/ActivityManager(88): ANR in process:
android.process.acore (last in android.process.acore)
05-31 10:12:49.238: INFO/ActivityManager(88): Annotation:
keyDispatchingTimedOut
05-31 10:12:49.238: INFO/ActivityManager(88): CPU usage:
05-31 10:12:49.238: INFO/ActivityManager(88): Load: 5.93 / 3.18 / 1.33
05-31 10:12:49.238: INFO/ActivityManager(88): CPU usage from 16159ms to 59ms
ago:
05-31 10:12:49.238: INFO/ActivityManager(88): android.process.acore: 77% =
77% user + 0% kernel / faults: 286 minor
05-31 10:12:49.238: INFO/ActivityManager(88): system_server: 16% = 14%
user + 1% kernel / faults: 213 minor
05-31 10:12:49.238: INFO/ActivityManager(88): com.networks: 4% = 4% user +
0% kernel / faults: 365 minor
05-31 10:12:49.238: INFO/ActivityManager(88): synaptics_wq: 0% = 0% user +
0% kernel
05-31 10:12:49.238: INFO/ActivityManager(88): wpa_supplicant: 0% = 0% user
+ 0% kernel
05-31 10:12:49.238: INFO/ActivityManager(88): tiwlan_wifi_wq: 0% = 0% user
+ 0% kernel
05-31 10:12:49.238: INFO/ActivityManager(88): events/0: 0% = 0% user + 0%
kernel
05-31 10:12:49.238: INFO/ActivityManager(88): adbd: 0% = 0% user + 0%
kernel
05-31 10:12:49.238: INFO/ActivityManager(88): TOTAL: 100% = 96% user + 3%
kernel
05-31 10:12:49.248: INFO/ActivityManager(88): Removing old ANR trace file
from /data/anr/traces.txt
05-31 10:12:49.288: INFO/Process(88): Sending signal. PID: 147 SIG: 3
05-31 10:12:49.288: INFO/dalvikvm(147): threadid=7: reacting to signal 3
05-31 10:12:49.488: INFO/Process(88): Sending signal. PID: 88 SIG: 3
05-31 10:12:49.488: INFO/dalvikvm(88): threadid=7: reacting to signal 3
05-31 10:12:49.578: INFO/dalvikvm(147): Wrote stack trace to
'/data/anr/traces.txt'
Can anyone help with the problem? Or pin point the area the problem is
coming from?
Thanks in advance
On Sat, May 29, 2010 at 11:12 AM, Kostya Vasilyev <[email protected]>wrote:
> You are welcome.
>
> It really is non-intuitive. I had reports from my users about widget
> intermittently not responding to clicks, but didn't know how to approach it.
>
> Finally, after buying a Moto Milestone, I saw that my widget got completely
> screwed up every time I pulled out the keyboard and the orientation changed.
> That gave me a good reproducible case to investigate.
>
> Anyway, good luck.
>
> -- Kostya
>
> 29.05.2010 14:09, Dirk Vranckaert пишет:
>
> Kostya,
>>
>> at first sight, that helped!
>> Thanks a lot for pointing me that out!
>>
>> Greetz..
>>
>> Dirk
>>
>> On 29 mei, 11:04, Kostya Vasilyev<[email protected]> wrote:
>>
>>
>>> Dirk,
>>>
>>> This is the reason your widget sometimes stops responding to clicking.
>>>
>>> Each and every RemoteViews update needs to specify complete state,
>>> including data and PendingIntents (if any). The home screen process can
>>> be bumped out of memory, and Android uses the most recent RemoteViews to
>>> recreate widgets. If it's incomplete and only contains text updates,
>>> then pending intents will be lost.
>>>
>>> Same thing happens on orientation changes - there is no onUpdate(), just
>>> the mechanism described above.
>>>
>>> -- Kostya
>>>
>>> 2010/5/29 Dirk Vranckaert<[email protected]>
>>>
>>>
>>>
>>>
>>>
>>>> I think String is right about that. I wouldn't do that either just to
>>>> save battery life!
>>>>
>>>>
>>>
>>>
>>>> However I think it is better to set the update interval of the applet
>>>> to a high enough amount of time (like 24 hours or sth) and just update
>>>> the widget manually. I'm currently working on a widget to and in my
>>>> case the widget only receives an update upon clicking a certain
>>>> button.
>>>>
>>>>
>>>
>>>
>>>> The way I do that is like this:
>>>>
>>>>
>>>
>>>
>>>> RemoteViews rv = new RemoteViews(context.getPackageName(), WIDGET);
>>>> rv.setTextViewText(R.id.textField, "Updated value for some text on the
>>>> widget");
>>>> ComponentName cn = new ComponentName(context, YourActivity.class);
>>>> AppWidgetManager mgr = AppWidgetManager.getInstance(context);
>>>> mgr.updateAppWidget(cn, rv);
>>>>
>>>>
>>>
>>>
>>>> That should basically work to update a widget.
>>>> Oh and one tip: using the this method you should do all updating just
>>>> after the line "rv.setTextViewText(...)". If you execute this entire
>>>> block a few times after each other you can get into troubles when
>>>> updating the widget.
>>>>
>>>>
>>>
>>>
>>>> Dirk
>>>>
>>>>
>>>
>>>
>>>> On 28 mei, 23:40, String<[email protected]> wrote:
>>>>
>>>>
>>>>> Before you get too far into this, you need to be aware that the widget
>>>>> architecture isn't designed to update that frequently. There's a lot
>>>>> of overhead, and updating every ten seconds will seriously impact
>>>>> battery life. As will having a service continually running in the
>>>>> background, for that matter.
>>>>>
>>>>>
>>>>
>>>
>>>> It's a cool idea but I'm not sure it's well suited for a widget,
>>>>> unfortunately.
>>>>>
>>>>>
>>>>
>>>
>>>> String
>>>>>
>>>>>
>>>>
>>>
>>>> On May 28, 2:43 pm, "[email protected]"<[email protected]> wrote:
>>>>>
>>>>>
>>>>
>>>
>>>> I am currently learning about widgets in Android.
>>>>>>
>>>>>>
>>>>>
>>>
>>>> I want to create a WIFI widget that will display the SSID, the RSSI
>>>>>> (Signal) level.
>>>>>>
>>>>>>
>>>>>
>>>
>>>> But I also want to be able to send it data from a service I am running
>>>>>> that calculates the Quality of Sound over wifi.
>>>>>>
>>>>>>
>>>>>
>>>
>>>> Here is what I have after some reading and a quick tutorial:
>>>>>>
>>>>>>
>>>>>
>>>
>>>> ---
>>>>>>
>>>>>>
>>>>>
>>>
>>>> public class WlanWidget extends AppWidgetProvider{
>>>>>>
>>>>>>
>>>>>
>>>
>>>> RemoteViews remoteViews;
>>>>>> AppWidgetManager appWidgetManager;
>>>>>> ComponentName thisWidget;
>>>>>> WifiManager wifiManager;
>>>>>>
>>>>>>
>>>>>
>>>
>>>> public void onUpdate(Context context, AppWidgetManager
>>>>>> appWidgetManager,
>>>>>> int[] appWidgetIds) {
>>>>>> Timer timer = new Timer();
>>>>>> timer.scheduleAtFixedRate(new
>>>>>>
>>>>>>
>>>>> WlanTimer(context, appWidgetManager),
>>>>
>>>>
>>>>> 1, 10000);
>>>>>>
>>>>>>
>>>>>
>>>
>>>> }
>>>>>>
>>>>>>
>>>>>
>>>
>>>> private class WlanTimer extends TimerTask{
>>>>>>
>>>>>>
>>>>>
>>>
>>>> RemoteViews remoteViews;
>>>>>> AppWidgetManager appWidgetManager;
>>>>>> ComponentName thisWidget;
>>>>>>
>>>>>>
>>>>>
>>>
>>>> public WlanTimer(Context context, AppWidgetManager
>>>>>>
>>>>>>
>>>>> appWidgetManager)
>>>>
>>>>
>>>>> {
>>>>>>
>>>>>>
>>>>>
>>>
>>>> this.appWidgetManager = appWidgetManager;
>>>>>> remoteViews = new
>>>>>>
>>>>>>
>>>>> RemoteViews(context.getPackageName(),
>>>>
>>>>
>>>>> R.layout.widget);
>>>>>> thisWidget = new ComponentName(context,
>>>>>>
>>>>>>
>>>>> WlanWidget.class);
>>>>
>>>>
>>>>> wifiManager =
>>>>>> (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
>>>>>>
>>>>>>
>>>>>
>>>
>>>> }
>>>>>>
>>>>>>
>>>>>
>>>
>>>> @Override
>>>>>> public void run() {
>>>>>>
>>>>>>
>>>>>
>>>
>>>> remoteViews.setTextViewText(R.id.widget_textview,
>>>>
>>>>
>>>>> wifiManager.getConnectionInfo().getSSID());
>>>>>> appWidgetManager.updateAppWidget(thisWidget,
>>>>>>
>>>>>>
>>>>> remoteViews);
>>>>
>>>>
>>>>> }
>>>>>>
>>>>>>
>>>>>
>>>
>>>> }
>>>>>>
>>>>>>
>>>>>
>>>
>>>> ---
>>>>>>
>>>>>>
>>>>>
>>>
>>>> The above seems to work ok, it updates the SSID on the widget every 10
>>>>>> seconds.
>>>>>>
>>>>>>
>>>>>
>>>
>>>> However what is the most efficent way to get the information from my
>>>>>> service that will be already running to update periodically on my
>>>>>> widget?
>>>>>>
>>>>>>
>>>>>
>>>
>>>> Also is there a better approach to updating the the widget rather than
>>>>>> using a timer and timertask? (Avoid polling)
>>>>>>
>>>>>>
>>>>>
>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Android Developers" group.
>>>> To post to this group, send email to
>>>> [email protected]
>>>> To unsubscribe from this group, send email to
>>>> [email protected]<android-developers%[email protected]><android-developers%2Bunsubs
>>>> [email protected]>
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/android-developers?hl=en
>>>>
>>>>
>>>
>>
>
>
> --
> Kostya Vasilev -- WiFi Manager + pretty widget --
> http://kmansoft.wordpress.com
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]<android-developers%[email protected]>
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en