اجرای برنامه در پس زمینه با 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();
}
});
}
}
مشکل شما توی توقف 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() { ...
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .