Android Servis Çalıştırma
-
Merhaba mürit ve mürideler,
Android de bir servisim vardı bu servis de webSocket çalışıyor. Android 8.0 dan sonra arkaplan servislerini çalıştırmamaya başlamış ne saçma bir durum oldu bu benim için anlatamam.
Bir Adet webSocket'im var bu socketten sürekli ver akışı oluyor.
Bir Adet BroadCast Reciever ile Telefon boot edildiğinde Servisi çalıştırıyorum. Fakat servis kendi kendine kapanıyor durduk yere. Ne yaptım ne ettim olmadı. Bir tane JobScheduler yazdım her 5 saniyede bir servisi kontrol edip başlatıyorum. Bu sefer de ben başlatıyorum OS kapatıyor ben başlatıyorum **mk Işletim sistemi kapatıyor lanet olsun ya kafayı yemek üzereyim. Arka planda sürekli çalışan bir servis yaratmak istiyorum bir türlü beceremedim... Şu ***mk Whatsapp'ı Instagram'ı vs. nasıl yapıyor bu işi ? Bu **mk evlatları bu uygulamayı yazıyorsa bende yazmak istiyorum.. Arka planda servis yazmam gerekiyor olmazsa olmaz şuan. Yardım edebilecek var mı ???
Örnek kodlarım şu şekilde.
GCMServiceTask kodları ;
public class BestTimeService extends GcmTaskService { private static final String TAG = "Deneme-App"; private boolean isMyServiceRunning(Class<?> serviceClass) { ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (serviceClass.getName().equals(service.service.getClassName())) { return true; } } return false; } @Override public int onRunTask(TaskParams taskParams) { Context context=getApplicationContext(); if(!isMyServiceRunning(DenemeService.class)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(new Intent(context,DenemeService.class)); }else{ context.startService(new Intent(context,DenemeService.class)); } } Log.i(TAG, "onRunTask"); switch (taskParams.getTag()) { case "checkService": Log.i(TAG, "checkService"); // This is where you need to perform the background tasks. return GcmNetworkManager.RESULT_SUCCESS; default: Log.i(TAG, "FAILURE checkService"); return GcmNetworkManager.RESULT_FAILURE; } } }
BroadCast Kodları ;
public class BootReciever extends BroadcastReceiver { private static final String TAG="Deneme-App"; @Override public void onReceive(Context context, Intent intent){ try{ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(new Intent(context,DenemeService.class)); }else{ context.startService(new Intent(context,DenemeService.class)); } GcmNetworkManager mGcmNetworkManager = GcmNetworkManager.getInstance(context); Task periodicTask = new PeriodicTask.Builder() .setService(BestTimeService.class) .setPeriod(1) .setFlex(1) .setTag("checkService") .setPersisted(true) .build(); int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context); if (resultCode == ConnectionResult.SUCCESS) { mGcmNetworkManager.schedule(periodicTask); } else { Log.e("Deneme-App", "Hello - Tag"); } Log.e("Deneme-App", "Hello - Tag - OK"); Log.e("Deneme-App","Starting Service ConnectivityListener"); }catch(Exception e){ Log.e("Deneme-App",e.toString()); } } }
Service kodları ;
public class DenemeService extends Service { @Nullable @Override public IBinder onBind(Intent ıntent) { Log.e("Deneme-App", "Service Started"); return null; } @Override public void onRebind(Intent intent) { Log.e("Deneme-App", "Service onRebind"); super.onRebind(intent); } @Override public void onTaskRemoved(Intent rootIntent) { Log.e("Deneme-App", "Service onTaskRemoved"); super.onTaskRemoved(rootIntent); } @Override public void onDestroy() { Log.e("Deneme-App", "Service onDestroy"); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { Log.e("Deneme-App", "Service onUnbind"); return super.onUnbind(intent); } @Override public int onStartCommand(Intent intent, int flags, int startId) { PushNotification(); Toast.makeText(getApplicationContext(), "OK", Toast.LENGTH_LONG).show(); return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { Log.e("Deneme-App", "Service onCreate"); super.onCreate(); } }
Manifest Kodları ;
<service android:name=".BestTimeService" android:exported="true" android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> <intent-filter> <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" /> </intent-filter> </service> <service android:name=".DenemeService" /> <receiver android:name=".BootReciever" android:enabled="true" android:exported="false" android:label="BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver>
Bu ***mk lalesi beni kanser edecek bir türlü yapamadım.. Yukarıdaki kodda Telefon Boot edildiğinde servisi başlatıyor. Boot edildikten sonra JobScheduler çalışıyor ve servisi kontrol ediyor şayet servis çalışmıyorsa servisi tekrar başlatıyor...
Bu algoritmanın sonucunda şöyle işlem adımı oluşuyor.
-Telefon başlatıldı.
-BroadCast çalıştı.
-Servis başlatıldı.
-JobScheduler başlatıldı.
-Servis durduruldu.
////Ebesinin bilmem hangi zamanına kadar böyle bir iş döngüsü oluşuyor . Ben başlatıyom o kapatıyo ben başlatıyom o kapatıyo ben başlatıyorum o kapatıyor. Hayır karşımda muhattab olsa kafasını gözünü kırcam ama karşımda bir kod parçası var bir bok yapamıyoruz da. Trip atsa gönlünü alcaz. Para istese parasını vercez . Kızdan ayrıldıysa morali bozuksa yeni kız bulcaz yok **mk yok.
{
-JobScheduler çalıştı.
-Servis başladı.
-Servis durduruldu.
}
-
https://stackoverflow.com/questions/4708827/persistent-service Burayı okudun mu?
-
-
@Jpriest, Yok abi aynı şey zaten benim attığım kod ile sadece IntentService kullanmış ben Service kullandım bir farkı yok. Bu adamlar Servis içerisinde sürekli olarak bir iş yaptırdığından Scheduling mantığı olabilir. Ama bana sürekli realtime açık kalabilecek bir yapı lazım. Böyle Job ile değil. Servisin durmaması gerekiyor.
@YeniHarman , inceleyeyim abi.