مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 90
موضوعها: 24
تاریخ عضویت: فروردین ۱۳۹۴
اعتبار:
9
سپاس ها 32
سپاس شده 68 بار در 34 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۸, ۰۷:۰۸ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۱۰, ۰۹:۰۴ ب.ظ توسط admin.)
با سلام.
من میخوام که برنامه در یک تاریخ و ساعت مشخص کاری را انجام بدهد.
کلیدهای 2981 و 2983 رو خوندم و از اونها برای ایجاد یک تایمر استفاده کردم و کد زیر را نوشتم:
کد پیاچپی: long mili_time = System.currentTimeMillis(); long Current_time = mili_time / 1000L; // زمان فعلی به ثانیه
long Goal_time = componentTimeToTimestamp(2016, 2, 2, 9, 0, 0); // زمان هدف به ثانیه
long remind = Goal_time - Current_time; // زمان باقیمانده برای سپری شدن به ثانیه
این هم که تابع componentTimeToTimestamp :
کد پیاچپی: long componentTimeToTimestamp(int year, int month, int day, int hour, int minute, int second) {
Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month); c.set(Calendar.DAY_OF_MONTH, day); c.set(Calendar.HOUR, hour); c.set(Calendar.MINUTE, minute); c.set(Calendar.SECOND, second); c.set(Calendar.MILLISECOND, 0);
return (long) (c.getTimeInMillis() / 1000L); }
در این مثال قرار هست که حدود 4 روز دیگر این تایمر کاری را انجام بدهد.
اما مقدار Remind عددی بیش از این را نشان میدهد(برای این مثال حدود 2948829 ثانیه) یعنی حدود 34 روز دیگر.
به نظر شما مشکل کجاست؟؟
باتشکر
سپاس شده توسط | |
|
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 346
موضوعها: 7
تاریخ عضویت: اسفند ۱۳۹۳
اعتبار:
142
سپاس ها 183
سپاس شده 647 بار در 292 ارسال
حالت من: هیچ کدام
به نظر من نمیدونم چرا در مستندات به این صورت نوشته شده .واقعا واسه من خیلی سوال هست. ایندکس ماه از 0 هست تا 11 !!! یعنی شما میخواید ماه دوم بزارید باید عدد 1 رو بزارید.این مشکل توی یک زمانی واقعا بنده رو اذیت کرد.
امیدوارم شما دیگه این نکته رو همیشه یادتون باشه
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 90
موضوعها: 24
تاریخ عضویت: فروردین ۱۳۹۴
اعتبار:
9
سپاس ها 32
سپاس شده 68 بار در 34 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۸, ۰۸:۱۵ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۰۸, ۰۸:۳۳ ب.ظ توسط msh.)
(۱۳۹۴/۱۱/۰۸, ۰۷:۴۶ ب.ظ)داش بهروز نوشته: به نظر من نمیدونم چرا در مستندات به این صورت نوشته شده .واقعا واسه من خیلی سوال هست. ایندکس ماه از 0 هست تا 11 !!! یعنی شما میخواید ماه دوم بزارید باید عدد 1 رو بزارید.این مشکل توی یک زمانی واقعا بنده رو اذیت کرد.
امیدوارم شما دیگه این نکته رو همیشه یادتون باشه
ممنون از پاسخ درست شما. حل شد.
اما یک مطلب دیگه :
برای انجام کار در لحظه مد نظر از Reciver استفاده کردم که جواب میدهد اما اگر گوشی ریست یا خاموش / روشن شود reciver از بین میرود.
حتی در حالتی که صفحه گوشی lock میشه باز هم reciver جواب نمیده تا زمانیکه صفحه گوشی رو باز کنی و داخل برنامه بشی.
برای این امر باید چه کنم؟
باتشکر
سپاس شده توسط | |
|
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 346
موضوعها: 7
تاریخ عضویت: اسفند ۱۳۹۳
اعتبار:
142
سپاس ها 183
سپاس شده 647 بار در 292 ارسال
حالت من: هیچ کدام
یک BroadcastReceiver تعریف کن .و کد ست کردن آلارم رو داخلش قرار بده ،که زمانی که گوشی ریستارت شد،و دوباره اجرا شد ،تنظیمات آلارم دوباره ست بشه و ازبین نره.
مثلا یک کلاس تعریف کن به نام My_reciver بعدش ارث بری کنه این کلاس از BroadcastReceiver
فقط یادت نره که داخل منیفست خط زیر اضافه کنی
کد پیاچپی: <receiver android:name="My_Reciver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 90
موضوعها: 24
تاریخ عضویت: فروردین ۱۳۹۴
اعتبار:
9
سپاس ها 32
سپاس شده 68 بار در 34 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۸, ۰۸:۵۸ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۰۸, ۱۰:۲۳ ب.ظ توسط admin.)
(۱۳۹۴/۱۱/۰۸, ۰۸:۴۷ ب.ظ)داش بهروز نوشته: یک BroadcastReceiver تعریف کن .و کد ست کردن آلارم رو داخلش قرار بده ،که زمانی که گوشی ریستارت شد،و دوباره اجرا شد ،تنظیمات آلارم دوباره ست بشه و ازبین نره.
مثلا یک کلاس تعریف کن به نام My_reciver بعدش ارث بری کنه این کلاس از BroadcastReceiver
فقط یادت نره که داخل منیفست خط زیر اضافه کنی
کد پیاچپی: <receiver android:name="My_Reciver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
یعنی جدا از اون رسیوری که الان برای ست کردن الارم نوشتم، یک رسیور دیگه ست کنم؟
خب از کجا میفهمه که بعد ریست شدن باید بیاد بره تو کلاس ست مجدد؟
سپاس شده توسط | |
|
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 346
موضوعها: 7
تاریخ عضویت: اسفند ۱۳۹۳
اعتبار:
142
سپاس ها 183
سپاس شده 647 بار در 292 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۸, ۰۹:۲۱ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۰۸, ۱۰:۲۴ ب.ظ توسط admin.)
ببینید رسیور در واقع یه جورایی گوش به زنگ هست. یعنی مثلا وقتی گوشی عمل خاصی انجام داد اون رسیور واکنش نشون بده.
حالا وقتی شما داخل رسیور تون نوشتید
کد پیاچپی: <action android:name="android.intent.action.BOOT_COMPLETED" />
در واقع شما میگید هر دفعه عمل بوت انجام شد .این رسیور شروع به کار کن.وقتی شما کد ست کردن آلارم داخل این رسیور بزارید.به این معنی هست که وقتی گوشی ریستارت شد.میاد آلارم دوباره ست میکنه.
منظورتون از رسیور جدا نفهمیدم
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 90
موضوعها: 24
تاریخ عضویت: فروردین ۱۳۹۴
اعتبار:
9
سپاس ها 32
سپاس شده 68 بار در 34 ارسال
حالت من: هیچ کدام
بله متوجه شدم و اینکار را انجام دادم اما متاسفانه پس از ریست الارم نمیده.
باضافه اینکه در بحث lock شدن گوشی(وقتی صفحه گوشی خاموشه) بایدباید راه دیگه ای وجود داشته باشه. درسته؟
سپاس شده توسط | |
|
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 90
موضوعها: 24
تاریخ عضویت: فروردین ۱۳۹۴
اعتبار:
9
سپاس ها 32
سپاس شده 68 بار در 34 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۸, ۰۹:۴۹ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۰۸, ۱۰:۲۴ ب.ظ توسط admin.)
نقل قول:باضافه اینکه در بحث lock شدن گوشی(وقتی صفحه گوشی خاموشه) بایدباید راه دیگه ای وجود داشته باشه. درسته؟
این مشکل را با اضافه کردم مجوز
کد پیاچپی: <uses-permission android:name="android.permission.WAKE_LOCK"/>
حل کردم.
فقط مشکل فعلی همان بحث ریست و عمل نکردن رسیور هست..
مواردی که گفته شد را اضافه کردم ولی باز هم پس از ریست شدن در بخش manage app رسیور فعال نیست و آلارم داده نمیشه ، مگر اینکه مجدد وارد برنامه شم.
سپاس شده توسط | |
|
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 258
موضوعها: 8
تاریخ عضویت: دى ۱۳۹۴
اعتبار:
99
سپاس ها 36
سپاس شده 482 بار در 215 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۸, ۱۰:۵۳ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۱۰, ۰۹:۰۲ ب.ظ توسط admin.)
سلام
این Permission رو هم به androidManifest اضافه کردید؟
کد: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 90
موضوعها: 24
تاریخ عضویت: فروردین ۱۳۹۴
اعتبار:
9
سپاس ها 32
سپاس شده 68 بار در 34 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۸, ۱۱:۰۵ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۱۰, ۰۹:۰۲ ب.ظ توسط admin.)
سلام
بله ولی جواب نمیدهد.
مجوزها
کد پیاچپی: <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permision.RECEIVE_BOOT_COMPLETED"/>
کد پیاچپی: <receiver android:name="MyBroadcastReceiver" android:enabled="true" android:exported="false" android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
این هم کد آلارم :
کد پیاچپی: Intent intent = new Intent(this, MyBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (remind * 1000), pendingIntent);
سپاس شده توسط | |
|
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 258
موضوعها: 8
تاریخ عضویت: دى ۱۳۹۴
اعتبار:
99
سپاس ها 36
سپاس شده 482 بار در 215 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۸, ۱۱:۰۶ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۱۰, ۰۹:۰۲ ب.ظ توسط admin.)
البته اگه از گوشی های htc استفاده میکنید
باید ّFilter زیر رو هم Receiver اضافه کنید
کد: <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 346
موضوعها: 7
تاریخ عضویت: اسفند ۱۳۹۳
اعتبار:
142
سپاس ها 183
سپاس شده 647 بار در 292 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۹, ۰۲:۴۷ ق.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۱۰, ۰۹:۰۲ ب.ظ توسط admin.)
همون طور که دوستمون گفت شما باید از هردو اکشن برای رسیور استفاده کنید.
کد پیاچپی: <receiver android:name="BootReciver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver>
برخی از مدلهای گوشی به این صورت هست.
در واقع 2 عمل بوت کردن میتونه اتفاق بیوفته.یکی که بوت کامل صورت میگیره بیشتر زمانی هست که باتری گوشی تموم بشه و یا گوشی برای مدت زیادی خاموش بشه و..... ولی وقتی شما گوشی خاموش روشن میکنی ،fastBoot اتفاق میوفته ، که در این صورت شما باید اکشن مربوط به این عمل رو به رسیورتون بدید.
با قطعه کد بالا باید آلارم شما انجام بشه. اگه کار نکرد ،مطمئن بشید که اجازه دسترسی ست کردن آلارم در فایل منیفست قرار دادید. یا قطعه کدتون مشکل داره.
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 258
موضوعها: 8
تاریخ عضویت: دى ۱۳۹۴
اعتبار:
99
سپاس ها 36
سپاس شده 482 بار در 215 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۹, ۱۲:۰۷ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۴/۱۱/۱۰, ۰۹:۰۳ ب.ظ توسط admin.)
اگه هنوز جواب نگرفتید بیاید از این سناریو استفاده کنید
یک کلاس جدید بسازید که از Service. Extend بشه و یک سرویس رو بسازید
در کلاس BroadCastReceiver بجای فعال کردن AlarmManager بیاید و Service جدید و start کنید
که در واقع سرویس بیاد و کارای مربوط به AlarmManager رو برای شما انجام بده
کدهای مربوط به MyBroadCastReceiver
کد: import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;
public class MyBroadCastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent)
{
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
// Put here YOUR code.
Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example
SetAlarm(context);
wl.release();
}
public void SetAlarm(Context context)
{
AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyBroadCastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 10, pi); // Millisec * Second * Minute
}
}
کدهای مربوط به MyService
کد: import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
public class Myservice extends Service {
MyBroadCastReceiver myBroadCastReceiver = new MyBroadCastReceiver();
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
myBroadCastReceiver.SetAlarm(this);
return START_STICKY;
}
@Override
public void onStart(Intent intent, int startId) {
myBroadCastReceiver.SetAlarm(this);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
کدهای فایل AndroidManifest
کد: <?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.mahdi.alarmmanager"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver android:name=".MyBroadCastReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<service android:name=".Myservice"
android:enabled="true">
</service>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
با این روش بدون نیاز به اجرای برنامه . دقیقا بعد از Boot شدن device پیغام آلارم داده میشه و دوباره تنظیم میشه برای آلارم بعدی.
BroadCastReceiver و Service هر دو فعال هستند.
Alarm برو روی 10 ثانیه تنظیم شده.
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 90
موضوعها: 24
تاریخ عضویت: فروردین ۱۳۹۴
اعتبار:
9
سپاس ها 32
سپاس شده 68 بار در 34 ارسال
حالت من: هیچ کدام
سلام
باتشکر از پاسخ هر دو دوست عزیز، بله با اضافه کردن permission گفته شده آلارم کار کرد. روش استفاده از سرویس هم کار کرد.
تنها یک مسئله اون هم اینکه در هر دو حالت بعد از ریست شدن، آلارم مجدد ست میشه + علاوه بر اون تمام کد های لحظه آلارم رو هم یکمرتبه همونجا انجام میده.
البته که سر موعود مقرر هم الارم میده اما مشکل این هست که چرا پس از ریست فقط آلارم ست نمیشه؟
من کدها رو به این فرم در آوردم تا تفاوت قائل شه اما باز هم نشد :
کد پیاچپی: @Override public void onReceive(Context context, Intent intent) { if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { Toast.makeText(context, "آلارم مجدد ست شد", Toast.LENGTH_LONG).show(); SetAlarm(context); } else { Toast.makeText(context,"Alaaaaaaarm!!!!", Toast.LENGTH_LONG).show(); Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(500); } }
سپاس شده توسط | |
|
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)
ارسالها: 90
موضوعها: 24
تاریخ عضویت: فروردین ۱۳۹۴
اعتبار:
9
سپاس ها 32
سپاس شده 68 بار در 34 ارسال
حالت من: هیچ کدام
۱۳۹۴/۱۱/۰۹, ۰۵:۳۲ ب.ظ
متوجه مشکل شدم. به نظرم از مشکل از نوع ست کردن آلارم بود که alarmmanager.setRepeating و به alarmmanager.set تغییر دادم و مشکل حل شد.
با تشکر از راهنمایی های خوب شما
|