2016-03-31 93 views
1

即使應用程序關閉(殺死),或者即使用戶沒有啓動應用程序,我也希望服務正在運行。我想在安裝應用程序後啓動服務,從這一點開始,服務需要每十分鐘運行一次。需要在evey中持續運行10分鐘的Android服務

雖然我找到了一些解決方案,如

那些沒有工作給我,因爲我在Android的編程新。 如果有任何示例工作源代碼,請向我提供如何開發它的信息。

這裏是我的服務類..

public class MyService extends Service { 

    MyReceiver receiver = new MyReceiver(); 

    public void onCreate() 
    { 
     super.onCreate();  
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

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

    @Override   
    public void onStart(Intent intent, int startId) 
    { 
     receiver.SetAlarm(this); 
    } 

} 

這裏是我的接收機類..

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     try { 
      PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
      PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ""); 
      wl.acquire(); 

      // Put here YOUR code. 
      Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example 

      wl.release(); 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void SetAlarm(Context context) 
    { 
     AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, UploadLocReceiver.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute 
    } 

} 

我在AndroidManifest.xml文件增值業務及接收器。

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

<service android:name=".MyService" 
      android:exported="false" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </service> 

<receiver android:name=".MyReceiver" > 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      </intent-filter> 
     </receiver> 

我在主要活動中添加了以下代碼。

Intent service = new Intent(getApplicationContext(), MyService.class); 
     this.startService(service); 

回答

1

Android操作系統會通知。

添加接收機清單文件,它會通知您該用戶已安裝的應用程序:

<receiver android:name="com.mypackagename.Installreceiver" android:exported="true"> 
     <intent-filter> 
      <action android:name="com.android.vending.INSTALL_REFERRER" /> 
    </intent-filter> 
</receiver> 

2.將運行啓動服務將繼續每隔10分鐘從Installreceiver廣播接收機。

public class Installreceiver extends BroadcastReceiver{ 
     @Override 
     public void onReceive(Context context, Intent intent) { 
     context.startService(new Intent(context.getApplicationContext(), YourService.class)); 
     } 
    } 

YourService.java

public class YourService extends Service { 

    private static String TAG = "MyService"; 
    private Handler handler; 
    private Runnable runnable; 
    private final int runTime = 10000; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i(TAG, "onCreate"); 

     handler = new Handler(); 
     runnable = new Runnable() { 
      @Override 
      public void run() { 

       handler.postDelayed(runnable, runTime); 
      } 
     }; 
     handler.post(runnable); 
    } 

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

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

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

更新1:

如果OS殺死你的服務,那麼你需要做其他接收器重新開始。

添加以下兩種方法在服務:

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    super.onTaskRemoved(rootIntent); 
    sendBroadcast(new Intent("IWillStartAuto")); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    sendBroadcast(new Intent("IWillStartAuto")); 
} 

4.添加接收機manifest

<receiver android:name=".RestartServiceReceiver" > 
    <intent-filter> 
     <action android:name="IWillStartAuto" > 
     </action> 
     </intent-filter> 
</receiver> 

5.添加接收機

public class RestartServiceReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    context.startService(new Intent(context.getApplicationContext(), YourService.class)); 
    } 
} 

更新2:

6.添加權限清單中。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

7.清單中添加接收器。

<receiver android:name=".BootCompletedReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
     </intent-filter> 
</receiver> 

7. BootCompletedReceiver,JAVA:

public class BootCompletedReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent arg1) { 
    context.startService(new Intent(context.getApplicationContext(), YourService.class)); 
    } 
} 

希望這會幫助你。

+0

嗨@HirenPatel,我跟着你的代碼。但是,啓動應用程序時會運行一次。如果我關閉/終止應用程序,則服務運行一次。它不會每十分鐘運行一次。我試圖在MyService類的「OnStartCommand」方法中添加日誌消息。 – NML

+0

@NML,是請分享查詢 –

+0

Hi @HirenPatel,我跟着你的代碼。但是,啓動應用程序時會運行一次。如果我關閉/終止應用程序,則服務運行一次。它不會每十分鐘運行一次。我試圖在MyService類的「OnStartCommand」方法中添加日誌消息。 – NML

0

那麼,你已經在你的問題中有答案,你所需要做的只是嘗試那些答案。 如果你仍然無法做到,那麼在這裏發佈你的代碼。這就是Stack overflow的工作原理。

僅供參考使用AlarmManager 10分鐘間隔:)當你安裝的申請表Play商店

相關問題