رفتن به مطلب
  • 0

مشکل استفاده از Timer در service هنگامی مه گوشی به حالت Sleep میرود.


jeqele

سوال

سلام دوستان.

یه سورس نوشتم که از یک اکتیویتی تشکیل میشه که وقت باز شدن یک سرویس از نوع استیکی رو فراخوانی میکنه.

در سرویس یه تایمر اینیشیالایز و Enable میشه که هر یک دقیه میاد زمان رو در یک فایل به نام Loge.txt داخل rootexternal که همون صفحه اول فایل منیجرتونه ذخیره میکنه.

مثلا اگه تایمر در روز 22 میلادی ساعت 8 و 27 دقیقه اجرا بشه در لوگ نوشته میشه.: TIME: 22/8/27

حالا مشکل اینجاست که وقتی گوشی به حالت Sleep میره، یعنی صفحه گوشی خاموش میشه تایمر دیگه کار نمیکنه و به لوگ دستگاه چیزی اضافه نمیکنه.

اولا که لطف کنین و برنامه رو روی گوشی هاتون نصب و اجرا کنین تا مطمعن بشم مشکل مربوط به یه گوشی یا ورژن خاص اندروید نیست.

ثانیا اگه راه کاری دارید ممنون میشم کمکی بکنید.

بعد از نزدیک به 3 ماه دیباگ کردن برنامه فهمیدم این مشکل برناممه. مشکل خیلی بزرگی برای برنامه هاییه که در پس زمینه باید کاری رو انجام بدن.

اینم کد های سرویس:

#Region  Service Attributes 
   #StartCommandReturnValue: android.app.Service.START_STICKY
   #StartAtBoot: true
#End Region

Sub Process_Globals
   Dim Tm As Timer
   Dim Notification1 As Notification
End Sub

Sub Service_Create
   Tm.Initialize("Tm", 60000)
End Sub

Sub Service_Start (StartingIntent As Intent)
   Tm.Enabled = True
   DoEvents
End Sub

Sub Service_Destroy
   StartServiceAt("", DateTime.Now + (5 * DateTime.TicksPerSecond), True)
End Sub

Sub Tm_Tick
   'this function will save the ticking time into the file "Loge.txt" in rootexternel directory.'
   If File.Exists(File.DirRootExternal, "Loge.txt") Then
       Dim clog As List
       clog.Initialize
       clog = File.ReadList(File.DirRootExternal, "Loge.txt")
       File.Delete(File.DirRootExternal, "Loge.txt")
       clog.Add("TIME:" & DateTime.GetDayOfMonth(DateTime.Now) & "/" & DateTime.GetHour(DateTime.Now) & "/" & DateTime.GetMinute(DateTime.Now))
       File.WriteList(File.DirRootExternal, "Loge.txt", clog)
   Else
       Dim clog As List
       clog.Initialize
       clog.Add("TIME:" & DateTime.GetDayOfMonth(DateTime.Now) & "/" & DateTime.GetHour(DateTime.Now) & "/" & DateTime.GetMinute(DateTime.Now))
       File.WriteList(File.DirRootExternal, "Loge.txt", clog)
   End If
   DoEvents
End Sub

جنبه آموزشی هم برای تازه کارا داره این سورس چون روش صحیح نوشتن یک StickyService همینه.

رمز هم نگذاشتم واسه دانلود تا سر راه همکاری دوستان سنگی نیاد. :-D

http://s6.picofile.com/file/8185141918/teste_timer.rar.html

لینک ارسال
به اشتراک گذاری در سایت های دیگر

17 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

اگه درست متوجه شده باشم این سورس کارتون رو انجام میده

http://s4.picofile.com/file/8185313342/teste_timer.rar.html

نشد امان جان.

سورسو از حالت forground خارج کردم و استیکی کردمش.

بقیشو دست نزدم.

وقتی وایرلس وصله نسبتا خوب کار می کرد.

رفتم بیرون یه دوری زدم وایرلسکه قطع شد تایمر هم قطع شد.

با کلک رشتی نمیشه داداش اینو باید پایه ای درست کنن.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

این مشکلو منم داشتم نمیدونم چرا کسی توجه نمیکرد*monkey*

باید به سازندش بگیم کسی لایسنس هست که بهش بگه؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

دوستان چی شد کسی تونست مشکلو حل کنه؟

این خیلی مشکل مهمیه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

دوستان گوشی تو شارژ باشه بازم کار میکنه

جون من برید به سازندش بگید من برام خیلی مهمه پروژم لنگ همین قضیه هست*wall*

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به جاش از startserviceat استفاده کن کار میکنه.

فقط فاصله بین تیک زدن تایمرت خیلی کم باشه احتمال داره سرویست crash کنه.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام

اینم یه تستی بکنید

تو Process_Globals  این متغیر رو تعریف کنین

Dim scrvar As Boolean

بعد دو تا sub اینجوری

Sub ScreenOn
      scrvar = True
          سایر کدهاتون
End Sub

Sub ScreenOff
      سایر کدهاتون
End Sub
لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام دوستان.

یه سورس نوشتم که از یک اکتیویتی تشکیل میشه که وقت باز شدن یک سرویس از نوع استیکی رو فراخوانی میکنه.

در سرویس یه تایمر اینیشیالایز و Enable میشه که هر یک دقیه میاد زمان رو در یک فایل به نام Loge.txt داخل rootexternal که همون صفحه اول فایل منیجرتونه ذخیره میکنه.

مثلا اگه تایمر در روز 22 میلادی ساعت 8 و 27 دقیقه اجرا بشه در لوگ نوشته میشه.: TIME: 22/8/27

حالا مشکل اینجاست که وقتی گوشی به حالت Sleep میره، یعنی صفحه گوشی خاموش میشه تایمر دیگه کار نمیکنه و به لوگ دستگاه چیزی اضافه نمیکنه.

اولا که لطف کنین و برنامه رو روی گوشی هاتون نصب و اجرا کنین تا مطمعن بشم مشکل مربوط به یه گوشی یا ورژن خاص اندروید نیست.

ثانیا اگه راه کاری دارید ممنون میشم کمکی بکنید.

بعد از نزدیک به 3 ماه دیباگ کردن برنامه فهمیدم این مشکل برناممه. مشکل خیلی بزرگی برای برنامه هاییه که در پس زمینه باید کاری رو انجام بدن.

اینم کد های سرویس:

#Region  Service Attributes 
   #StartCommandReturnValue: android.app.Service.START_STICKY
   #StartAtBoot: true
#End Region

Sub Process_Globals
   Dim Tm As Timer
   Dim Notification1 As Notification
End Sub

Sub Service_Create
   Tm.Initialize("Tm", 60000)
End Sub

Sub Service_Start (StartingIntent As Intent)
   Tm.Enabled = True
   DoEvents
End Sub

Sub Service_Destroy
   StartServiceAt("", DateTime.Now + (5 * DateTime.TicksPerSecond), True)
End Sub

Sub Tm_Tick
   'this function will save the ticking time into the file "Loge.txt" in rootexternel directory.'
   If File.Exists(File.DirRootExternal, "Loge.txt") Then
       Dim clog As List
       clog.Initialize
       clog = File.ReadList(File.DirRootExternal, "Loge.txt")
       File.Delete(File.DirRootExternal, "Loge.txt")
       clog.Add("TIME:" & DateTime.GetDayOfMonth(DateTime.Now) & "/" & DateTime.GetHour(DateTime.Now) & "/" & DateTime.GetMinute(DateTime.Now))
       File.WriteList(File.DirRootExternal, "Loge.txt", clog)
   Else
       Dim clog As List
       clog.Initialize
       clog.Add("TIME:" & DateTime.GetDayOfMonth(DateTime.Now) & "/" & DateTime.GetHour(DateTime.Now) & "/" & DateTime.GetMinute(DateTime.Now))
       File.WriteList(File.DirRootExternal, "Loge.txt", clog)
   End If
   DoEvents
End Sub

جنبه آموزشی هم برای تازه کارا داره این سورس چون روش صحیح نوشتن یک StickyService همینه.

رمز هم نگذاشتم واسه دانلود تا سر راه همکاری دوستان سنگی نیاد. :-D

http://s6.picofile.com/file/8185141918/teste_timer.rar.html

یه سوال این برنامه حتما میخاد یه رویداد رو همراه با اون لوگ ثبت کنه دیگه؟

اون رویداد چی هس؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

منم روی گوشیم تست کردم یکی بود چند تا نبود داره کار میکنه :-d

مشکل داره انگار کلا

قبلا هم توی یکی از تاپیک ها مطرح شده بود همچین مشکلی ولی متاسفانه جدی نگرفتیم *fekr*

ورژن اندرویدم هم: 4.2.2

لینک ارسال
به اشتراک گذاری در سایت های دیگر

یه سوال این برنامه حتما میخاد یه رویداد رو همراه با اون لوگ ثبت کنه دیگه؟

اون رویداد چی هس؟

توی برنامه اصلی که به این مشکل خوردم خیلی پیچیده تره.

یک تایمر برای آپدیت دارم.

یم تایمر برای ارسال اطلاعات به سرور.

یک تایمر برای گرفتن coarselocation و FineLocation.

یک تایمر برای گرفتن بررسی نوع شبکه و گرفتن اطلاعات از برج ارایه دهنده سیگنال و قدرت سیگنال.

چون برنامه پیچیده بود خیلی وقته که فکر میکردم ایراد از کد نویسی ها بوده اما هیچ حای کارم مشکل نداشت حتی یه جاهایی از کدها رو که شک داشتم مستقیم جاوا نوشتم.

دیشب فهمیدم که ایراد از تایمره.

این سورسو آزمایشی نوشتم دیدم همه زمان ها رو ثبت نمیکنه.

ادروید منم 4.4.2

واقعا مشکل بزرگیه.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام

بنده نتونستم برنامه رو تست کنم ( به دلایلی که مهدی جان میدونه)

درسته اقای خلیلی اگه یادتون باشه بنده هم یک برنامه توی همین مایه ها داشتم که با زمان بندی مشکل داشتم یعنی تایمر گاهی عمل میکرد و گاهی نه.

این مشکلو باید باهم و هم فکری خودمون حل کنیم و یا درخواست کنیم از سازندش ( Erel ) که همچین مشکلی وجود داره و شاید راه پیشنهادی خوبی داشتن و یا اینکه بتونن توی نسخه بعدی بهینه سازی رو انجام بدن.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام

بنده نتونستم برنامه رو تست کنم ( به دلایلی که مهدی جان میدونه)

درسته اقای خلیلی اگه یادتون باشه بنده هم یک برنامه توی همین مایه ها داشتم که با زمان بندی مشکل داشتم یعنی تایمر گاهی عمل میکرد و گاهی نه.

این مشکلو باید باهم و هم فکری خودمون حل کنیم و یا درخواست کنیم از سازندش ( Erel ) که همچین مشکلی وجود داره و شاید راه پیشنهادی خوبی داشتن و یا اینکه بتونن توی نسخه بعدی بهینه سازی رو انجام بدن.

آره یادمه.

خیلی رو نرومه این قضیه.

همه چیو ریخت به هم.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

کتاب خانه phone رو فعال کنید

توی sub globals تعریف میکنیم :

Private pe As PhoneEvents
pe.Initialize("pe")

Sub pe_ScreenOff (Intent As Intent)
   'کدت واسه زمانیکه صفحه خاموشه
End Sub

Sub pe_ScreenOn (Intent As Intent)
'کدت واسه زمانیکه صفحه روشنه
End Sub

منم همین مشکل رو داشتم با این کار رفع کردم

لینک ارسال
به اشتراک گذاری در سایت های دیگر

کتاب خانه phone رو فعال کنید

توی sub globals تعریف میکنیم :

Private pe As PhoneEvents
pe.Initialize("pe")

Sub pe_ScreenOff (Intent As Intent)
   'کدت واسه زمانیکه صفحه خاموشه
End Sub

Sub pe_ScreenOn (Intent As Intent)
'کدت واسه زمانیکه صفحه روشنه
End Sub

منم همین مشکل رو داشتم با این کار رفع کردم

متوجه سوال نشدی ایمان جان.

مثلا کاربر 1 ساعت پشت فرمونه و اسکرینش خاموشه، توی اون یک ساعت متاسفانه تایمر باید هر یه دقیقه ثبت اطلاعات کنه که نمیکنه.

در ضمن اینو توی سروی فورگرند هم تست کردم همینه.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

امین جان من واسه برنامه تازه موزیک از تایمر استفاده کردم که موزیک جدید اومد اعلام کنه حتما جایی اشتباه کردین واسه پروژه گوشیت پره شده هم از همین استفاده کردم واسه من کار داده میتونید پروژه ای که میخواین انجام بدید رو بدید چک کنم؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

امین جان شما الان باید تایمر رو در

Sub pe_ScreenOff (Intent As Intent)
   'کدت واسه زمانیکه صفحه خاموشه
End Sub

این قسمت قرار بدی وقتی صفحه خاموش شد تایمر فعال میمونه لطفا تست کنید اگه باز هم مشکل داشت سورس پیوست کنید

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ایمان جان من یک سورس ساده با سویس و تایمر توی پست اول آپلود کردم.

اونو اجرا کن رو گوشیت میبینی که فایل لوگ همه ی زمان ها رو ثبت نمیکنه متاسفانه.

البته وقتی اسکرین خاموشه ولی وای فای وصله هم تا حدودی درست کار میکنه.

شما اونو تغییر بده هر جور که صلاح میدونی اگه مشکل حل شد ما از خجالتت هر جور بخوای در میایم.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

اگه درست متوجه شده باشم این سورس کارتون رو انجام میده

http://s4.picofile.com/file/8185313342/teste_timer.rar.html

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...