آپدیت نشدن روزانه و یجت
ویجت ذکر روزهای هفته. کل پروژه رو گذاشتم جالب اینجاست
یه بار کار میکنه تاریخ ها رو که عوض میکنم کار نمیکنه
و یا ساعت 12 شب هم یه بار کار میکنه یه بار نه.........
این فایل widget توی پوشه xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget"
android:minHeight="146dip"
android:minWidth="146dip"
android:updatePeriodMillis="86400000"/>
این manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.allbaloo.app.zekreRooz"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.SET_TIME" />
<application
android:icon="@drawable/imag1"
android:label="@string/app_name" >
<activity
android:name=".Info"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.INFO" />
</intent-filter>
</activity>
<receiver
android:name="MyWidget"
android:label="@string/lable" >
<intent-filter>
<action android:name="AUTO_UPDATE" />//این کد رو پیدا کردم نمیدونم درسته یا نه؟
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
<intent-filter>
<action android:name="ACTION_AUTO_UPDATE_WIDGET" />//و این خط
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget" />
</receiver>
<service
android:name=".MyService"
android:enabled="true" />
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
این AppWidgetProvider
import java.util.Calendar;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
public class MyWidget extends AppWidgetProvider {
private PendingIntent service = null;
public AlarmManager m;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.AM_PM, Calendar.AM);
final Intent i = new Intent(context, MyService.class);
if (service == null)
{
service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}
m.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 86400000, service);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Calendar cale = Calendar.getInstance();
cale.set(Calendar.HOUR_OF_DAY, 0);
cale.set(Calendar.MINUTE, 0);
cale.set(Calendar.AM_PM, Calendar.AM);
final Intent i = new Intent(context, MyService.class);
if (service == null)
{
service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}
m.setRepeating(AlarmManager.RTC_WAKEUP, cale.getTimeInMillis(), 86400000, service);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
}
این هم Service
import java.util.Calendar;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.IBinder;
import android.widget.RemoteViews;
public class MyService extends Service
{
RemoteViews view;
@Override
public void onCreate()
{
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
buildUpdate();
return super.onStartCommand(intent, flags, startId);
}
private void buildUpdate()
{
view = new RemoteViews(getPackageName(), R.layout.widget);
ComponentName thisWidget = new ComponentName(this, MyWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
Calendar calendar = Calendar.getInstance();
int getrooz = calendar.get(Calendar.DAY_OF_WEEK);
if (getrooz == 1) {
view.setImageViewResource(R.id.imgzekr, R.drawable.imag2);
}
if (getrooz == 2) {
view.setImageViewResource(R.id.imgzekr, R.drawable.imag3);
}
if (getrooz == 3) {
view.setImageViewResource(R.id.imgzekr, R.drawable.imag4);
}
if (getrooz == 4) {
view.setImageViewResource(R.id.imgzekr, R.drawable.imag5);
}
if (getrooz == 5) {
view.setImageViewResource(R.id.imgzekr, R.drawable.imag6);
}
if (getrooz == 6) {
view.setImageViewResource(R.id.imgzekr, R.drawable.imag7);
}
if (getrooz == 7) {
view.setImageViewResource(R.id.imgzekr, R.drawable.imag1);
}
manager.updateAppWidget(thisWidget, view);
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
}
شما PendingIntent رو مقدار دادید ولی به اصطلاح fireـِش نکردید،
service.send();
البته من از سرویس و AlarmManager استفاده نکردم، مقدار updatePeriodMillis رو گذاشته بودم رو حداقل یعنی نیم ساعت.
میتونید PendingIntent رو روی ImageView هم تنظیم کنید تا با کلیک روی اون ویجت بروز بشه.
کلاس ویجت (در این جا وقتی رو ویجت زده میشه به کلاس ActivityMain وارد میشه )
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
public class ExampleAppWidgetProvider 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 ExampleActivity
Intent intent = new Intent(context, ActivityMain.class);
PendingIntent pendingIntent = PendingIntent.getActivity(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.example_appwidget);
views.setOnClickPendingIntent(R.id.analogClock1, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
لی اوت ویجت ( بجای ساعتی که من گذاشتم هر چیزی میتونه باشه )
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<AnalogClock
android:id="@+id/analogClock1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:dial="@drawable/backclock"
android:resizeMode="horizontal|vertical" />
</LinearLayout>
xml ویجت ( 144 در 144 اندازه ویجت هست که می تونید تغییر بدید ) این برای یک ویجت 2*2
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/example_appwidget"
android:minHeight="144dp"
android:minWidth="144dp"
android:updatePeriodMillis="86400000" >
</appwidget-provider>
این قسمت رو هم در مانیفست در تگ اپلیکیشن اضافه کنید
<receiver
android:name="ExampleAppWidgetProvider"
android:label="clock Widget" >
<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>
( تو label اسم ویجت تونه )
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .