2016-05-07 2 views
0

Я создал Service в моем приложении для Android, которое автоматически заходит на BOOT_COMPLETE через BroadcastReceiver. И это работает отлично. Но эта служба выполняет задачу, которую я определил внутри метода onCreate(), только один раз. На другой стороне я хочу запустить Service навсегда в фоновом режиме. Фактически внутри метода onCreate() Я читаю данные из моей базы данных, и при необходимости создаю уведомления. И уведомления могут быть сгенерированы в любое время, поэтому я хочу запустить мой сервис навсегда. Я новичок в Android, и я видел примеры &, но они не помогли. Так любезно ответьте, что как я могу запустить мой Service навсегда.Запуск службы навсегда в фоновом режиме - Android

Это код услуг:

package com.example.abc.project1; 

import android.app.*; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.*; 
import org.json.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 


public class HelloService extends Service { 

    private static final String TAG = "HelloService"; 
    public static boolean isRunning = false; 

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


    @Override 
    public void onCreate() { 
     isRunning = true; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       /*Here I want to do my task forever (reading from database & generate notifications)*/ 
      } 
     }).start(); 
    } 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return Service.START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     isRunning = false; 
    } 

} 

Это код BroadcastReceiver

package com.example.abc.project1; 

import android.content.*; 
import android.util.Log; 

public class MyBroadcastreceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent startServiceIntent = new Intent(context, HelloService.class); 
     context.startService(startServiceIntent); 
    } 
} 

Это часть AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.abc.project1"> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gef.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_CATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="@string/google_maps_key" /> 

     <service android:name=".HelloService"></service> 

     <receiver android:name="com.example.abc.project1.MyBroadcastreceiver" android:enabled="true" android:exported="false"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.PACKAGE_REPLACED" /> 
       <data android:scheme="package" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.PACKAGE_ADDED" /> 
       <data android:scheme="package" /> 
      </intent-filter> 
     </receiver> 

    </application> 

</manifest> 
+0

Я разместил здесь довольно чистое отличное решение. Надеюсь, поможет. http://stackoverflow.com/questions/9029040/how-to-run-an-android-app-in-background/43555050#43555050 – user2288580

ответ

1

Согласно Service documentation

сервис будет на данный момент продолжает работать до Context.stopService() или stopSelf() называется.

Таким образом, ваша служба будет работать вечно, пока система не решит ее убить из-за нехватки ресурсов.

+0

, но когда я запускаю эту службу, она выполняет задачу только один раз. почему это так? –

+0

Потому что ваша задача находится внутри onCreate, и этот код называется только один раз при создании службы. Итак, вы хотите, чтобы ваш код работал бесконечно? Но почему? Если данные базы данных можно обновить, и когда они будут обновлены, вам необходимо создать уведомление, которое вы можете просто создать IntentService каждый раз, когда вам нужно создать уведомление. –

+0

уведомление может быть создано даже в том случае, если мое приложение не работает. поэтому как я могу постоянно проверять свою базу данных, даже когда мое приложение не работает? –

0

Напишите код вашего обработчика в onStartCommand. Но помните, что ваше обслуживание будет приостановлено, когда устройство перейдет в «спящий режим».

2

Это очень просто.
Этапы:
1.create a Служба класс.
2.Create BroadcastReceiver класса
3.call BroadReceiver в OnDestroy метода обслуживания
4.In OnReceive метода BroadReceiver старт класса обслуживания еще раз.
refer this link