Majid Ebrahimi

اجرای Service یکبار برای همیشه و intent-filter ها در BroadcastReceiver ها

1 ارسال در این موضوع قرار دارد

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

اجرای Service یکبار برای همیشه 

ابتدا کلاس سرویس را بنویسید:


 

public class ServiceClass extends Service {

   final static int myID = 1234;

   @Override

   public void onCreate() {

       // TODO Auto-generated method stub

       super.onCreate();

       Log.d("Testing", "Service got created");

       Toast.makeText(this, "ServiceClass.onCreate()", Toast.LENGTH_LONG).show();

       registerReceiver(new ReceiverCall(),

               new IntentFilter(Intent.ACTION_TIME_TICK));

   }

   @Override

   public void onDestroy() {

       // TODO Auto-generated method stub

       super.onDestroy();

   }

   @Override

   public void onStart(Intent intent, int startId) {

       // TODO Auto-generated method stub

       super.onStart(intent, startId);

       Toast.makeText(this, "ServiceClass.onStart()", Toast.LENGTH_LONG).show();

       Log.d("Testing", "Service got started");

       Notification notification = new Notification(R.drawable.s, getText(R.string.app_name),

               System.currentTimeMillis());

       Intent notificationIntent = new Intent(this, ServiceClass.class);

       PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

       notification.setLatestEventInfo(this, getText(R.string.app_name),

               getText(R.string.app_name), pendingIntent);

       startForeground(myID, notification);

     

       }      


   @Override

   public IBinder onBind(Intent arg0) {

       // TODO Auto-generated method stub

       return null;

   }

}

 

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

سپس سرویس خود را در اکتیویتی راه اندازی می کنیم:

       Intent intent = new Intent(this, ServiceClass.class);

       final PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);

       AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

       alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), System.currentTimeMillis(), pintent);

   

          

 

همانطور که می بنید مقدار پارامتری که مدت زمان تکرار سرویس را مشخص می کند برابر  System.currentTimeMillis() قرار می دهیم.پس تفاضل آن 

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

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

  -intent-filter ها در BroadcastReceiver ها

همانطور که می دانید BroadcastReceiver ها بر اساس intent-filter ای که برای آن تعریف شده اجرا می گردد.مثلا BroadcastReceiver هر وقت گوشی ریبوت شد اجرا گردد،یا هر دقیقه یک بار اجرا شود.در ورژن های قبل از یازده شما کدی که می نویسید باید در پنج ثانیه اجرای آن خاتمه یابد وگرنه خطا رخ می دهد. ولی در ورژن های یازده به بالا می توان این مشکل را با اجرای یک متد خاص برطرف کرد(ببخشید.الان حضور ذهن در مورد نام آن متد ندارم.)شما می توانید intent-filter های مجاز برای هر API را در مسیر نوعی [/font]D:\dev\sdk\android\platforms\android-7\data در فایل broadcast_actions پیدا کنید. البته دو فایل دیگر در این آموزش قرار می گیرد تا بتوانید بهتر از intent-filter ها استفاده کنید

حال کلاس BroadcastReceiver خود را می نویسیم و در آن کلاس سرویس را اجرا می کنیم:

public class ReceiverCall extends BroadcastReceiver {

   private Object BroadcastReceiver;

   @Override

   public void onReceive(Context context, Intent intent) {

       Log.i("Service Stops", "Ohhhhhhh");

       context.startService(new Intent(context, ServiceClass.class));

   }

}

 

حال در منیفست برنامه receiver را تعریف می کنیم.

 

<reciver name=".ReceiverCall"
/>

 

همانطور که می بینید.ما برای receiver خود دو عمل مشخص کرده ایم که با رخ دادن آنها ابتدا receiver و سپس service اجرا خواهد شد.1-هر دقیقه یکبار 2-ریبوت.

در مورد برخی intent-filter ها باید آنها را در سرویس خود رجیستر کنیم.در مورد TIME_TICK نیز به همین منوال است و به همین خاطر ما آن را در service رجیستر کرده ایم.

حتما این آموزش دارای مشکل های فراوانی هست که امیدواریم شما این نقص ها را پوشش دهید.

در آخر فایل های پیوست.

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

ReceivingBroadcastIntents.pptx

android1.docx

ReceivingBroadcastIntents.pptx

android1.docx

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


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

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری