PDA

View Full Version : پخش موزیک در کلیه اکیتویتی ها



samiasoft
شنبه 14 مهر 1397, 04:23 صبح
سلام دوستان

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

برای اینکار در کلاس زیر چنین سرویسی را تعریف کردم :

public class BackgroundMusicService extends Service {

public static MediaPlayer player;


public IBinder onBind(Intent arg0) {
return null;
}


@Override
public void onCreate() {
super.onCreate();


player = MediaPlayer.create(this, R.raw.music);
player.setLooping(true); // Set looping
player.setVolume(100,100);


}


public int onStartCommand(Intent intent, int flags, int startId) {


player.start();


return 1;
}


@Override
public void onDestroy() {
player.stop();
player.release();
}


@Override
public void onLowMemory() {


}


}

و در مانیفیست هم تعریف کردم :

<service android:name=".BackgroundMusicService"
android:stopWithTask="true" />





حالا در ماین اکیتویتی این سرویس را بدین صورت اجرا کردم :

startService(new Intent(MainActivity.this,BackgroundMusicService.cl ass));

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

برای حل این مساله در اکتیویتی های دیگر چیکار باید انجام داد ؟!

farhad_shiri_ex
شنبه 14 مهر 1397, 09:21 صبح
بهتره که سرویس را در کلاس application استارت کنید.

public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
startService(new Intent(this, BackgroundMusicService.class));
}
}


بهتره از IntentService استفاده کنی یا حتی خیلی بهتره از کلاس JobService تا اینکه از کلاس Service استفاده کنی علی الخصوص JobService خیلی بهینه تر شده ازنظر کاراآیی و بازدهی.

samiasoft
جمعه 11 آبان 1397, 19:15 عصر
بهتره که سرویس را در کلاس application استارت کنید.

public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
startService(new Intent(this, BackgroundMusicService.class));
}
}


بهتره از IntentService استفاده کنی یا حتی خیلی بهتره از کلاس JobService تا اینکه از کلاس Service استفاده کنی علی الخصوص JobService خیلی بهینه تر شده ازنظر کاراآیی و بازدهی.

دوست عزیز من درباره کدنویسی IntentService و JobService تحقیق کردم...منتهی میدونید JobService فقط در api 21 و بالاتر قابل اجرا هست پس این رو نمیتوانم استفاده کنم چون میخوام از api 17 هم استفاده کنم.


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

- ایا کدهایی که در پست اول نوشتم در اندروید بالاتر مثلا نسخه 8 کار میکنند یا خیر ؟ extends Service

- همین رو پس با IntentService بنویسم چطور ایا در اندروید 8 کار میکند ؟

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

نقل قول شده از یکی از دوستان :
"توی اندروید هشت سرویس یا اینتنت سرویس وقتی گوشی توی حالت doze mode هستش اجرا نمیشه، این قضیه در مورد همه ی کارهایی که بگراند انجام میشن صدق می‌کنه"

برای همین تنها راهی که فکر میکنم اصولی باشه اینه : یک شرط بزارم اگر api بالاتر 21 بود از جاب سرویس استفاده کنم و اگر پایینتر بود از سرویس یا اینتنت سرویس...نظرشما چیه ؟

یا اینکه از کتابخانه هایی مثل https://github.com/evernote/android-job استفاده کنم که البته تست نکردم هنوز.

و یه سوال دیگر اینکه مفهوم android:exported رو من متوجه نشم که در مانفیست برای سرویس اعمال میکنیم ..درواقع وقتی ترو هست با وقتی که فالس هست چه تفاوتی دارند؟


android:exported


true : can receive events sent by same or others applications


false‍ : can receive events sent by same application

farhad_shiri_ex
شنبه 12 آبان 1397, 14:46 عصر
- ایا کدهایی که در پست اول نوشتم در اندروید بالاتر مثلا نسخه 8 کار میکنند یا خیر ؟ extends Service

مگه داریم گوشی که اندروید 8 داشته باشه.! ولی من یکبار چک کردم البته روی شبیه ساز درست کار نکرد.



برای همین تنها راهی که فکر میکنم اصولی باشه اینه : یک شرط بزارم اگر api بالاتر 21 بود از جاب سرویس استفاده کنم و اگر پایینتر بود از سرویس یا اینتنت سرویس...نظرشما چیه ؟

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