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

جلوگیری از بسته شدن سرویس ، توسط برنامه optimize (پیشفرض در اندروید های 5 و بالاتر)


fun_code

سوال

با سلام و عرض ادب

 

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

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

مشکل اینجا بود که ، برنامه optimize که در اندروید های 5 و بالاتر بصورت پیشفرض وجود داره و هدف بهبود مصرف باتری هست ، میاد سرویس و کلا برنامه رو بطور کامل میبنده !

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

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

عملا برنامه بدون کاربرد میشه و حتما کاربر باید یه بار وارد برنامه بشه تا سرویس مجددا اجرا بشه...

 

البته از sticky و ... هم استفاده کردم نشد.

 

خواستم بپرسم چطوری این مشکل رو برطرف کنم ؟ (فکر کنم کافه بازار این مورد رو دور زده)

به نظرم مورد نیاز بسیاری از دوستان خواهد بود.

 

از راهنمایی شما سپاسگزارم

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

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

در 14 دقیقه قبل، محمد فرجی گفته است :

ببخشید یه سوال برام پیش اومدش 

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

اخه عجیبه ی خورده یا شاید من خوب متوجه نشدم 

چطور وقتی سرویس غیر فعاله کدای داخلش اجرا میشه :DD: شاید خنده دار باشه اما هرچقدر با خودم کلنجار رفتم نتونستم درک کنم 

یجورای شده عین مسئله اول مرغ بوده یا تخم مرغ 

به نظرم با یک بار اجرای کد به اندروید درخواست میدیم که فلان سرویس از برنامه ما رو اجرا کن ، زمانی که زمان گوشی تغییر کرد.

پس خود اندروید پس از تغییر زمان دستگاه میاد سرویس های مورد نظر برنامه هایی که چنین درخواستی دادن رو اجرا میکنه و در واقع رویداد pn_OnReceive اجرا میشه...

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

البته مطمئن نیستم و باید یه 2 روز تستش کنم تا شاید درکش کردم.

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

در در 1395/05/07, 12:55:44، fghdfg گفته است :

آقا محمد آموزش جاواش رو که گذاشتم جیگر :pardon:
http://answercenter.ir/topic/14458-%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8-broadcastreceiver-%D9%88-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%DA%86%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-%D9%88%D8%B1%DA%98%D9%86-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%AF%D8%B1-%D8%A8%DA%A9%DA%AF%D8%B1/
و اما توی بیسیک اول یه برودکست از نوع PNbrodcact ایجاد کن به صورت زیر رجیسترش کن


Sub Service_Start (StartingIntent As Intent)
pn.Initialize("pn")
pn.AddAction("android.intent.action.TIME_TICK")
pn.SetPriority(999)
pn.RegisterReceiver
End Sub

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


Sub pn_OnReceive(Action As String,keys() As String,Data As Object)
	If Action="android.intent.action.TIME_TICK" Then StartService(Me)
End Sub

محض اطمینان این رو هم به سرویسن میتونی اضافه کنی تو منیفست


AddServiceText(yourservice,android:process=":yourappname_background")

سلام دوست عزیز

سورس رو اجرا کردم ، با هر بار اجرای رویداد pn_OnReceive متغیر یک مرتبه Initialize میشه و پس از گذشت یک دقیقه چند مرتبه رویداد pn_OnReceive اجرا میشه...

اگر کدهای رویداد Service_Start رو در رویداد Service_Create قرار بدم ، ممکنه پس از بسته شدن سرویس ، متغیر PN مجددا ایجاد نشه و اینطوری سرویس بسته خواهد شد.

به نظر شما چکار کنم ؟

متشکرم

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

ببخشید یه سوال برام پیش اومدش 

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

اخه عجیبه ی خورده یا شاید من خوب متوجه نشدم 

چطور وقتی سرویس غیر فعاله کدای داخلش اجرا میشه :DD: شاید خنده دار باشه اما هرچقدر با خودم کلنجار رفتم نتونستم درک کنم 

یجورای شده عین مسئله اول مرغ بوده یا تخم مرغ 

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

در 11 دقیقه قبل، porya گفته است :

اینم

سلام دوست عزیز

ممنونم از انتشار کتابخونه...

الان تست می کنم. اگر سرویس پس از چند ساعت و یا گذشت 1 الی 2 روز بسته شد باید چکار کنم به نظر شما  ؟

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

در 7 دقیقه قبل، محمد فرجی گفته است :

ببخشید یه سوال برام پیش اومدش 

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

اخه عجیبه ی خورده یا شاید من خوب متوجه نشدم 

چطور وقتی سرویس غیر فعاله کدای داخلش اجرا میشه :DD: شاید خنده دار باشه اما هرچقدر با خودم کلنجار رفتم نتونستم درک کنم 

یجورای شده عین مسئله اول مرغ بوده یا تخم مرغ 

 

در 6 دقیقه قبل، nima_j گفته است :

سلام دوست عزیز

ممنونم از انتشار کتابخونه...

الان تست می کنم. اگر سرویس پس از چند ساعت و یا گذشت 1 الی 2 روز بسته شد باید چکار کنم به نظر شما  ؟

 

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

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

خیر ، برنامه رو از لیست برنامه های در حال اجرا بصورت دستی بستم و رویداد pn_OnReceive اجرا نشد. یعنی متاسفانه سرویس بسته شد و مجددا با مشکل مواجه شدیم.

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

برودکستی که در بالا آموزش داده شده از نوع دینامیکه یعنی داخل برنامه تنظیم میشه و قابلیت تغییر خصوصیات اون در زمان اجرا وجود داره ولی عیبی هم داره که اگه شما سرویس رو متوقف کنی دیگه رویداد اون اجرا نمیشه .
اما برودکست نوع دومی هم داره: استاتیک برودکست. استفاده از این برودکست هیچ کتابخانه ای نیاز نداره و وقتی سرویس بسته بشه باز هم رویدادش اجرا میشه تنها عیب اون ثابت بودنشه چون داخل مانیفست برنامه تعریف میشه و انعطاف پذیری کمتری داره.
آموزش استاتیک برودکست در سایت مرجع:
https://www.b4x.com/android/forum/threads/intent-filters-intercepting-sms-messages-in-the-background.20103/
یادتون باشه هر برودکستی مخصوص یه کاره مثلا استاتیک برای اموری که همیشه باید در اجرا باشند ولی دینامیک برای دوره های کوتاه مدت خوبه.

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

الان که تست میکنم و در رویداد Service_Destroy سرویس رو مجددا اجرا می کنم ، وقتی سرویس رو بصورت دستی از برنامه های در حال اجرا میبندی ، سرویس بسته میشه...

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

ولی به درد برنامه هایی (شبیه به خودم) که زمان زیاد براشون مهم نیست قابل اجرا است...

StartServiceAt(service_name,DateTime.Now+30*1000,False)

اما میگم کار جالبی نیست. اما راه دیگه ای نیافتم :(

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

در 10 ساعت قبل، maxi333 گفته است :

برودکستی که در بالا آموزش داده شده از نوع دینامیکه یعنی داخل برنامه تنظیم میشه و قابلیت تغییر خصوصیات اون در زمان اجرا وجود داره ولی عیبی هم داره که اگه شما سرویس رو متوقف کنی دیگه رویداد اون اجرا نمیشه .
اما برودکست نوع دومی هم داره: استاتیک برودکست. استفاده از این برودکست هیچ کتابخانه ای نیاز نداره و وقتی سرویس بسته بشه باز هم رویدادش اجرا میشه تنها عیب اون ثابت بودنشه چون داخل مانیفست برنامه تعریف میشه و انعطاف پذیری کمتری داره.
آموزش استاتیک برودکست در سایت مرجع:
https://www.b4x.com/android/forum/threads/intent-filters-intercepting-sms-messages-in-the-background.20103/
یادتون باشه هر برودکستی مخصوص یه کاره مثلا استاتیک برای اموری که همیشه باید در اجرا باشند ولی دینامیک برای دوره های کوتاه مدت خوبه.

ممنون بابت راهنماییتون

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

فقط تونستم در برنامه های مورد نیازم از اکشن "android.net.conn.CONNECTIVITY_CHANGE" برای زمانی که دستگاه وضعیت اتصالش به اینترنت تغییر میکنه استفاده کنم.

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

متشکرم

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

تو سرویست از برودکست رسیور استفاده کردی؟ اکشن time_tick رو که بگیری میتونی اگه هم سرویس به هر علتی بسته شد دوباره راه اندازیش کنی

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

تو سرویست از برودکست رسیور استفاده کردی؟ اکشن time_tick رو که بگیری میتونی اگه هم سرویس به هر علتی بسته شد دوباره راه اندازیش کن

عذر میخوام بابت اسپم اما میشه بپرسم دقیقا چطور اینکارو باید بکنیم ؟

چون یکی از دوستان بنده هم به خاطر همین سرویس ها از یکی از پروژه هاشون صرف نظر کردن البته توی بیسیک فکر کنم

اگه جاواش روهم لطف کنید ک دیگه خیلی خوب میشه 

مرسی  :53:  :crazy:  :give_rose:  ♥

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

آقا محمد آموزش جاواش رو که گذاشتم جیگر :pardon:
http://answercenter.ir/topic/14458-%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8-broadcastreceiver-%D9%88-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%DA%86%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-%D9%88%D8%B1%DA%98%D9%86-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%AF%D8%B1-%D8%A8%DA%A9%DA%AF%D8%B1/
و اما توی بیسیک اول یه برودکست از نوع PNbrodcact ایجاد کن به صورت زیر رجیسترش کن

Sub Service_Start (StartingIntent As Intent)
pn.Initialize("pn")
pn.AddAction("android.intent.action.TIME_TICK")
pn.SetPriority(999)
pn.RegisterReceiver
End Sub

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

Sub pn_OnReceive(Action As String,keys() As String,Data As Object)
	If Action="android.intent.action.TIME_TICK" Then StartService(Me)
End Sub

محض اطمینان این رو هم به سرویسن میتونی اضافه کنی تو منیفست

AddServiceText(yourservice,android:process=":yourappname_background")
لینک ارسال
به اشتراک گذاری در سایت های دیگر

@,

سلام

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

ممنونم بابت کمکتون.

فقط چند سوال دارم که ممنون میشم راهنماییم کنید:

 

1. متغیر pn از چه نوعی است ؟

 

2. رویداد pn_OnReceive دقیقا به چه چیزی گوش میده ؟ یعنی چه موقع این رویداد اجرا میشه ؟

 

3. اکشن android.intent.action.TIME_TICK به چه موردی مربوط هست ؟ یعنی هر از 999 میلی ثانیه این اکشن فعال و رویداد pn_OnReceive اجرا می شود ؟

 

4. اون کدی که در منیفست اضافه میشه چیزی شبیه به همین کد زیر هست ؟

Service.StartForeground(0,Null)
 و یا
 #StartCommandReturnValue: android.app.Service.START_STICKY

عذر میخوام سوالای زیادی پرسیدم.

اما کم پیش میاد فردی مثل شما پیدا بشه...

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

بازم ممنونم از لطفتون

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

@,

ببخشید یه سوال دیگه هم برام پیش اومد:

در کد زیر ،

AddServiceText(yourservice,android:process=":yourappname_background")

yourappname همون نام پکیج هست  همراه با _background ؟

 

در نسخه جدید B4A تابعی به نام StartServiceAtExact اضافه شده...

فکر میکنم این مشکل رو برطرف میکنه...

اینطور که پیداست روی اندروید های 4.4 و بالاتر قابل اجرا است.

یعنی باید نسخه اندروید رو چک کنم و نسبت به اون از StartServiceAtExact و با StartServiceAt استفاده کنم. درست فکر میکنم یا روش شما مطمئن تر هست ؟ (البته فکر میکنم راهنمایی شما جامع هست و همه نوع نیاز رو برطرف میکنه.کدی که گفتم فقط برای اجرای سرویس در فواصل زمانی متفاوت بصورت مکرر است.)

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

@,

ممنونم از توضیحاتتون

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

فر میکنم کتابخونه مورد نیاز رو ندارم... اگر دارید ممنون میشم آپلود کنید.

 

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

یعنی اگر بصورت دستی هم سرویس رو ببندید مجددا اجرا میشه... اما جالبه که با این حال در اندروید های بالا سرویس بسته میشه !!!

 

همچنین تست کردم و نوشتم سرویس هر از 10 ثانیه اجرا بشه... اما در کمال تعجب باز هم پس از مدتی سرویس بسته مشه...

 

خواستم بپرسم به نظرتون کدی که میگه هر 999 میلی ثانیه .... شبیه به همون StartServiceAt نیست ؟

حدس میزنم کارمون نشه...

امیدوارم اینجوری نشه...

 

ببخشید کد اینتنت اکشن کپی شدن متن رو دارید بهم بدید ؟

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

چون برنامه ای که دارم میسازم در ارتباط با کپی شدن متن هست...

خیلی ممنونم از همراهی شما

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

با سپاس

 

 

من تو اندروید 5 و 6 خبرنامه مخفی گذاشتم با سرویس پایدار ولی بسته نمیشه

 

تست شده 100 درصد

 

 

سامسونگ و سونی و هوآوی

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

با سپاس

 

 

من تو اندروید 5 و 6 خبرنامه مخفی گذاشتم با سرویس پایدار ولی بسته نمیشه

 

تست شده 100 درصد

 

 

سامسونگ و سونی و هوآوی

خب امکانش هست راهنمایی کنید چطور سرویس رو پایدار کردید ؟

ممنونم

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

خب امکانش هست راهنمایی کنید چطور سرویس رو پایدار کردید ؟

ممنونم

اول سرویستون این کد رو اضافه کنید

 

دیگه بسته میشه

 

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

#Region Module Attributes
	#StartAtBoot: True
	#StartCommandReturnValue: android.app.Service.START_STICKY
#End Region
لینک ارسال
به اشتراک گذاری در سایت های دیگر

 

اول سرویستون این کد رو اضافه کنید

 

دیگه بسته میشه

 

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

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

ممنونم

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

حتی در رویداد بسته شدن سرویس هم نوشتم مجددا سرویس اجرا بشه اما تاثیری نداشته

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

بایگانی شده

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

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

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