class DarkRaha extends com { // разработка приложений
            String a="Главная" b="Контакты" c="О сайте"
};

Android

Android API

Android GUI

Android Advance GUI

cреда разработки
cтруктура приложения
манифест файл
пример приложения
разрешения
ресурсы
альтернативные ресурсы
виджет приложения
публикация приложения

Разработка приложений под Android

Виджет приложения

Виджет приложения это особое приложение, чье окно может встраиваться в другие приложения и периодически обновляться. Приложение которое способно содержать подобные приложение называется хостом виджетов приложений.

Создается такое приложение расширением класса AppWidgetProvider и добавлением соответствующих описаний в манифест и в xml ресурс. Можно пользователю предоставить возможность настраивать виджет. После андроида 3.0 появилась возможность использовать коллекции.

На доступных мне телефонах установить виджет можно: длинный клик на экране домашнего экрана. Удалить виджет: длинный клик на виджете и там перенести его в корзину или нажать на крестик.

класс AppWidgetProvider

Это расширение класса BroadcastReceiver, имеет следующие методы:

описание в манифесте

В манифесте виджет приложения описывается следующим образом:


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

описание виджета

Свойства виджета описываются в отдельном xml файле в папке res/xml/


<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure" 
    android:resizeMode="horizontal|vertical">
</appwidget-provider> 

Значения атрибутов:

описание формы

В отличие от оконной формы активности, виджет приложения имеет ряд ограничений. Доступные группировщики:

Доступные виджеты, их расширения не считаются:

настройка виджета приложения

Для настройки виджет необходима соответствующая активность, которая указывается в описании виджета. Класс активности указывается полным именем (т.е. с пакетами).


<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:configure="com.example.android.ExampleAppWidgetConfigure" 
    ... >
</appwidget-provider>

В описании активности нужно указать, что она настраивает виджет приложения.


<activity android:name=".ExampleAppWidgetConfigure">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
    </intent-filter>
</activity>

обновление виджета приложения

Производители устройств устанавливают ограничение на минимальную частоту обновление виджета приложения - полчаса - экономия батареи. Для более частого обновления можно воспользоваться механизмом сервиса и алармов.

Следующий пример построен на основе этого кода с добавлением алармов, которые нужны для некоторых моделей. Виджет простой - отображает на экране локализованное время, которое изменяется каждые 5 секунд.


public class AppWidgetTest extends AppWidgetProvider {

    @Override
    public void onEnabled(Context context) {
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
            // запускаем наш сервис при каждом обновлении 
            // это если что-то слетело, через полчаса все восстановится
        context.startService(new Intent(context, UpdateService.class));
    }

    // наш сервис в котором и будет обновление виджета
    public static class UpdateService extends Service {

        AlarmManager alarms;
        PendingIntent alarmIntent;

        @Override
        public void onStart(Intent intent, int startId) {
            // обновляем виджет
            RemoteViews updateViews = new RemoteViews(this.getPackageName(),
                    R.layout.main);            
            updateViews.setTextViewText(R.id.tv, (new Date()).toLocaleString());            
                   
            // настраиваем аларм
            alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            String ALARM_ACTION;
            ALARM_ACTION = MainAlarmReceiver.ACTION_REFRESH_MAIN_ALARM;
            Intent intentToFire = new Intent(ALARM_ACTION);
            alarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);            
            int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
            // время обновления 5 секунд
            long timeToRefresh = SystemClock.elapsedRealtime() + 5000;
            alarms.set(alarmType, timeToRefresh, alarmIntent);
            
            // подтверждаем изменения в виджете    
            ComponentName thisWidget = new ComponentName(this, AppWidgetTest.class);
            AppWidgetManager manager = AppWidgetManager.getInstance(this);
            try {
                manager.updateAppWidget(thisWidget, updateViews);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    }
}

В обработчике сообщений от нашего аларма заново запускаем сервис.


public class MainAlarmReceiver extends BroadcastReceiver{
    
    public static final String ACTION_REFRESH_MAIN_ALARM =
        "com.demo.raha.ACTION_REFRESH_MAIN_ALARM";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent startIntent = new Intent(context, UpdateService.class);
        context.startService(startIntent);
    }    
}

В манифесте виджета приложения укажем оба ресивера (сам виджет и обработчик аларма), и вложенный сервис UpdateService.


<application
    android:icon="@drawable/icon" android:label="@string/app_name">

<receiver
    android:name=".AppWidgetTest" android:label="WidgetTest">
    <intent-filter>
    <action
    android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>

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

<receiver android:name=".MainAlarmReceiver">
    <intent-filter>
        <action    android:name="com.demo.raha.ACTION_REFRESH_MAIN_ALARM" />
    </intent-filter>
</receiver>

<service android:name=".AppWidgetTest$UpdateService" />
</application>

Далее нужно добавить xml описание виджета в папку res/xml, например widget.xml:


<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp" 
    android:minHeight="294dp"
    android:updatePeriodMillis="30000" 
    android:initialLayout="@layout/main" />

Рейтинг@Mail.ru