آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

اجرای برنامه در پس زمینه با Service ها

hojjati  12 سال پیش  12 سال پیش
+5 0

با سلام با راهنمایی های دوستان متوجه شدم که برای اینکه در پس زمینه کاری صورت گیرد باید از 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();

}
});

}
}
0 0
آقا با کمی ور رفتن تونستم بفهمم چطور باید یه کار را تکرار کند اما حالا مشکل جدید این است که بعد از اینکه روی دکمه cancel کلیک می کنم تا service متوقف شود. پیغام Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show(); میاد ولی سرویس متوقف نمی شود و هنوز پیغام می دهد و تا وقتی حذفش نکنم ادامه دارد؟ چرا؟ چطور باید سرویس را متوقف کنم؟ آخه آقای sadeghbarout گفته بود که اینطوری سرویس متوقف می شود پس چرا نمیشه؟ (12 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
sadeghbarout  12 سال پیش
+2 0

مشکل شما توی توقف 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();

            }
        });

    }
}
0 0
سلام اولاً از وقتی که گذاشتید بسیار بسیار ممنون هستم. من کاری که گفتید را کردم، وقتی دکمه وسط گوشی را فشار میدهم و وارد مجدداً وارد برنامه میشوم و دکمه cancel را میزنم برنامه دقیقاً همانطور که شما گفتید درست کار میکنه ولی وقتی start را میزنم و دکمه back گوشی را میزنم و مجدداً وارد برنامه میشوم و cancel را میزنم force close میده. دلیل خاصی داره؟؟ آندروید من 4.3 هست ممکن است بخاطر نسخه آندروید باشه؟ (12 سال پیش)
پاسخ به سوال 
sadeghbarout  12 سال پیش
+2 0

خواهش میکنم

نه ربطی به ورژن اندرویدت نداره

ببین وقتی شما برنامه رو میبندی و دوباره لود میکنی ، اون متغییر های 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() { ...

0 0
نمیدونم چرا کد ها رو رنگی نشون نمیده!!! (12 سال پیش)
0 0
خیلی خیلی ممنون. ماشاالله شما خودتان یه پا استاد هستید ها.:-) (12 سال پیش)
0 0
خواهش میکنم. نه بابا شما لطف دارید :) (12 سال پیش)
0 0
تشکر از محاوره ای که داشتید تقریبا سرویس برایم قابل فهم شد. (12 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .