اجرای برنامه در پس زمینه با Service ها
مدیریت گفتگو
با سلام با راهنمایی های دوستان متوجه شدم که برای اینکه در پس زمینه کاری صورت گیرد باید از service ها و alarmmanager ها استفاده کنم. الان یه برنامه نوشتم که مثلا هر 10 ثانیه یکبار یه پیغامی را بدهد اما نمیدانم چرا درست کار نمی کند و فقط 10 ثانیه اول پیغام را می دهد. من کدهای خودم را اینجا می گذارم شاید دوستان بدانند باید چیکار کنم.
این تو قسمت MY Service ام هست
package hojjati.saeed.apps.test_timer;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class MyAalarmService extends Service {
@Override
public void onCreate() {
Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show();
}
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show();
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG).show();
}
@Override
public boolean onUnbind(Intent intent) {
Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG).show();
return super.onUnbind(intent);
}
}
و این قسمت Activity ام
package hojjati.saeed.apps.test_timer;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class TestTimerActivity extends Activity {
private PendingIntent pendingintent;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnStart = (Button) findViewById(R.id.btnStart);
Button btnCancel = (Button) findViewById(R.id.btnCancel);
btnStart.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
Intent myintent = new Intent(TestTimerActivity.this, MyAalarmService.class);
pendingintent = PendingIntent.getService(TestTimerActivity.this, 0, myintent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 10);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5 * 1000, pendingintent);
Toast.makeText(TestTimerActivity.this, "Start Alarm", Toast.LENGTH_LONG).show();
}
});
btnCancel.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
AlarmManager alarmManger = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManger.cancel(pendingintent);
Intent stopIntent = new Intent(TestTimerActivity.this, MyAalarmService.class);
stopService(stopIntent);
Toast.makeText(TestTimerActivity.this, "Cancel Alarm", Toast.LENGTH_LONG).show();
}
});
}
}
پاسخها 2
مشکل شما توی توقف service نیست بلکه توی توقف alarmmanager تونه.
شما یه alarmManager توی btnstart درست کردید و شروعش کردید بعد دارید یه alarmManager دیگه توی btnCancle درست میکنید و متوقفش میکنید!!
فقط کافیه alarmmanager تون رو یکم بالاتر تعریف کنید . مثلا به عنوان یه فیلد :
public class TestTimerActivity extends Activity {
private PendingIntent pendingintent;
private AlarmManager alarmManager;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnStart = (Button) findViewById(R.id.btnStart);
Button btnCancel = (Button) findViewById(R.id.btnCancel);
btnStart.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
Intent myintent = new Intent(TestTimerActivity.this, MyAalarmService.class);
pendingintent = PendingIntent.getService(TestTimerActivity.this, 0, myintent, 0);
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 10);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5 * 1000, pendingintent);
Toast.makeText(TestTimerActivity.this, "Start Alarm", Toast.LENGTH_LONG).show();
}
});
btnCancel.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
alarmManager.cancel(pendingintent);
Intent stopIntent = new Intent(TestTimerActivity.this, MyAalarmService.class);
stopService(stopIntent);
Toast.makeText(TestTimerActivity.this, "Cancel Alarm", Toast.LENGTH_LONG).show();
}
});
}
}
نظرات
خواهش میکنم
نه ربطی به ورژن اندرویدت نداره
ببین وقتی شما برنامه رو میبندی و دوباره لود میکنی ، اون متغییر های AlarmManager , pendingIntent ت دوباره ساخته میشن ولی دوباره مقداردهی نمیشن!
برای رفع این مشکل فقط کافیه اون 2 خط مقدار دهی AlarmManager , pendingIntent و به طبع intent ی که قبلش برای مقداردهی pendingIntent ت ساختی رو از درون کدهای btnstart خارج و به بدنه اصلی oncreat منتقل کنی
اینطوری از برنامه خارج شدن که هیچ (!) اگه برنامه هم از حافظه خارج کنی بازم وقتی برنامه رو باز کنی و دکمه cancle رو بزنی دکمه کار میکنه ;)
یعنی باید به این شکل بشه :
...
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnStart = (Button) findViewById(R.id.btnStart); Button btnCancel = (Button) findViewById(R.id.btnCancel);
Intent myintent = new Intent(TestTimerActivity.this, MyAalarmService.class); pendingintent = PendingIntent.getService(TestTimerActivity.this, 0, myintent, 0); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); btnStart.setOnClickListener(new OnClickListener() { ...
نظرات
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
نظرات