رفتن به مطلب

جلوگیری از بسته شدن پروسس سرویس


امین شاهدی

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

با سلام.

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

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

برای اینکار از ServiceStartAt استفاده میکنیم

این کد رو میتونین تو هر مدول و هر جایی بزارین که مثل StartService عمل میکنه بعد یه زمان سرویس رو اجرا کنه ولی برای اینکه سرویس خودشو بعد از هر دوره زمانی اجرا کنه باید این کد رو داخل خو سرویس درون سابService_Start قرار بدین .

به این صورت :






[left]

Sub Process_Globals


End Sub



Sub Service_Create


End Sub


Sub Service_Start (StartingIntent As Intent)

StartServiceAt("", DateTime.Now + 10000,True)


End Sub


Sub Service_Destroy


End Sub[/left]



توضیح : برای اینکه سرویس خودشو اجرا کنه نام سرویس رو خالی بزارین . قسمت دوم هم زمان اجرا رو تعیین میکنیم ، که ما اینجا گفتیم 10 ثانیه بعد از زمان حال . قسمت سوم هم اگه میخواین زمانی که دستگاه stand by بود هم سرویس اجرا شه باید مقدار رو true قرار بدین در غیر این صورت false .

در این حالت حتی اگه برنامه رو کلا kill process کنین یا کلا ببندین باز هم بعد 10 ثانیه سرویس دوباره خودش اجرا میشه.

امیدوارم مفید بوده باشه *قلب*

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

خسته نباشید.

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

در اینصورت شما نیازی ندارید کدی که دوستمون زحمتشو کشیدن رو در Service_Start بنویسیم و اون موقع باید توی :

[b]Sub Service_Destroy 

End Sub[/b]

StartServiceAt رو فراخوانی کنیم.

یعنی صفات مربوط به سرویس میشه یک همچین چیزی :

[b]#Region  Service Attributes [/b]
[b]    #StartAtBoot: True[/b]
[b]    #StartCommandReturnValue: android.app.Service.START_STICKY[/b]
[b]#End Region[/b]

و در آخر تشکر از دوست خوبمون به خاطر آموزش *همینه*

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

آفرین. من اینو نمیدونستم خیلی مفید بود.

اما آقا مجید شما که اینو قرار دادی یعنی دیگه نیازی نیست از کدی که دوستمون داد استفاده کنیم؟

و سرویس رو باهمون دستور startservice اجرا کنیم و اون مقداری که گفتید رو مساوی true قرار بدیم؟؟

و اینکه آیا با این کار بعد از روشن شدن گوشی سرویس خودکار اجرا میشه؟

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

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

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

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

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

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

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

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

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

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

درسته

7,8 بار سرویس استارت بخوره برنامه has stop میده

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

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

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

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

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

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

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

شما کد رو به این شکل قرار بدید سرویس باید اجرا بشه :

StartServiceAt("", DateTime.Now + 10 * 1000,True)
لینک ارسال
به اشتراک گذاری در سایت های دیگر

خسته نباشید.

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

در اینصورت شما نیازی ندارید کدی که دوستمون زحمتشو کشیدن رو در Service_Start بنویسیم و اون موقع باید توی :

[b]Sub Service_Destroy 

End Sub[/b]

StartServiceAt رو فراخوانی کنیم.

یعنی صفات مربوط به سرویس میشه یک همچین چیزی :

[b]#Region  Service Attributes [/b]
[b]    #StartAtBoot: True[/b]
[b]    #StartCommandReturnValue: android.app.Service.START_STICKY[/b]
[b]#End Region[/b]

و در آخر تشکر از دوست خوبمون به خاطر آموزش *همینه*

ممنون مفید بود. فقط یه چیزی این کدی که من گفتم رو نمیشه توی Service_destroy به کار برد... دفعه اول خودمم امتحان کردم که بعد destory دوباره اجرا شه ولی کار نکرد

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

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

متاسفانه این دستور هم رو تو service_Destory نوشتم تاثیری نداشت!

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

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

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

آقای aminnnnnn پس به طور کلی نتیجه میگیریم آموزش شما به درستی کار نمیکنه و یا بیاید خودتون پاسخ گو باشید!*fekr*

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

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

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

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

ولی اگه دوتاشم همزمان بسته شدن دیگه هیچ *laie*

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

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

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

اما با اینی که شما میگی با بسته شدن برنامه هردو سرویس متوقف میشن.

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

آقای aminnnnnn پس به طور کلی نتیجه میگیریم آموزش شما به درستی کار نمیکنه و یا بیاید خودتون پاسخ گو باشید!*fekr*

واس من که داره درست کار میده . گفتم که من میخوام یک لینک رو واسه نوتیفیکیشن هر نیم ساعت چک کنه.

کاملا هم کار میکنه *hoho*

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

خب درسته این کار که طبیعیه باید انجام بده.

من منظورم اینه که به گفته شما اگه برنامه kill procces بشه بازهم سرویس خودشو بعد از 10ثانیه اجرا میکنه؟؟؟

که اینکارو نکرد*monkey*

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

خب درسته این کار که طبیعیه باید انجام بده.

من منظورم اینه که به گفته شما اگه برنامه kill procces بشه بازهم سرویس خودشو بعد از 10ثانیه اجرا میکنه؟؟؟

که اینکارو نکرد*monkey*

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

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

  • 2 هفته بعد...

سلام ببخشید میدونم پست قدیمیه ولی مجبور شدم

چطور میشه ک این کد رو غیر فعال کرد؟

StartServiceAt("", DateTime.Now + 10 * 1000,True)

یعنی مثلا یه شرطی بزاریم ک دیگه کار نکنه

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

پاکش کن دیگه *r24*

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

  • 1 سال بعد...

سلام

من برای پایدار شدن سرویسم از START_STICKY استفاده کردم و سرویسم بعد از بسته شدن اجرا میشه

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

میشه راهنمایی کنید؟

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

بایگانی شده

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

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

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