2012-02-07 5 views
6

私のプロジェクトでは、アンドロイドでサービスを作成する必要があります。Androidでのバックグラウンドサービスの作成

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Intent service = new Intent(getApplicationContext(), ServiceTemplate.class); 
    this.startService(service); 
} 

しかし、私は現在のアクティビティを殺した場合、サービスも破壊される - :私は以下のような活動の内側にこのサービスを呼び出しています

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 

    <service android:enabled="true" 
    android:name=".ServiceTemplate"/> 
     <activity 
     android:name=".SampleServiceActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

:私はこのようなサービスを登録することができています。私はこのサービスを常にバックグラウンドで実行する必要があります。 私は何をする必要がありますか? サービスを登録するにはどうすればよいですか? サービスを開始するにはどうすればよいですか?

+1

にAlarmManagerを呼び出すことができますか? – abhinav

答えて

4

しかし、現在のアクティビティを強制終了すると、そのサービスも強制終了します。私はこのサービスを常にバックグラウンドで実行する必要があります。私は何をする必要がありますか?

「現在のアクティビティを強制終了する」とは、タスクキラーを使用しているか、または設定アプリ内から強制停止を実行した場合、サービスが停止されます。あなたはそれについて何もできません。ユーザーがあなたのアプリをもう実行したくないと指示しました。ユーザーの希望を尊重してください。

stopService()に電話しない限り、「現在のアクティビティを殺す」とは、BACKまたはHOMEなどを押した場合、サービスは少なくとも少しは実行し続ける必要があります。それは永遠に続くことはありません - Androidは最終的にサービスを取り除くでしょう。開発者が多すぎると、常に「バックグラウンドで実行」しようとするサービスが作成されるためです。そして。もちろん、ユーザは、ユーザが望むときはいつでもサービスを終了することができる。

に積極的に価値を提供しているのがの場合、サービスは「実行中」である必要があります。これは通常、サービスが「常にバックグラウンドで実行されている」ことを意味しません。代わりに、AlarmManagerIntentServiceを使用して定期的に作業を行います。

+0

私は現在の活動をadb shell killコマンドで強制終了しています。ちょうど私はアラーム、SMS通知のようなサービスを作成するのが好きです。 – Sathish

+0

@ Sathish: "adbシェルのkillコマンド"が文書化されていることに気づいていないので、その特徴は何か分かりません。 – CommonsWare

1

オーバーライドこの方法:

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

それは永遠にバックグラウンドで実行されますか? –

3

は、あなたがあなたの活動を破壊するときに、サービスには影響されないように、別のスレッドでサービスを開始してみます。中断することなく実行されます。また、サービスでService.START_STICKYonStartCommand(intent, flags, startId)から返すようにするには、サービスがシステム(Android OS)によって強制終了された場合に再作成されていることを確認してください。

4

ここではサービスを永遠に保つための半異なる方法があります。あなたが希望したい場合は、コードでそれを殺すために方法はあり

バックグラウンドサービス:

package com.ex.ample; 

import android.app.Service; 
import android.content.*; 
import android.os.*; 
import android.widget.Toast; 

public class BackgroundService extends Service { 

    public Context context = this; 
    public Handler handler = null; 
    public static Runnable runnable = null; 

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

    @Override 
    public void onCreate() { 
     Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show(); 

     handler = new Handler(); 
     runnable = new Runnable() { 
      public void run() { 
       Toast.makeText(context, "Service is still running", Toast.LENGTH_LONG).show(); 
       handler.postDelayed(runnable, 10000); 
      } 
     }; 

     handler.postDelayed(runnable, 15000); 
    } 

    @Override 
    public void onDestroy() { 
     /* IF YOU WANT THIS SERVICE KILLED WITH THE APP THEN UNCOMMENT THE FOLLOWING LINE */ 
     //handler.removeCallbacks(runnable); 
     Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
     Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show(); 
    } 
} 
ここ

、あなたのメインの活動からそれを起動する方法か、あなたが好きなところです:

startService(new Intent(this, BackgroundService.class)); 

onDestroy()アプリケーションが閉じられたり強制終了されたときに呼び出されますが、実行可能ファイルはただちにバックアップを開始します。ハンドラのコールバックも削除する必要があります。

私はこれが誰かを助けてくれることを願っています。

いくつかの例では、ユーザ/従業員が特定の物事を停止することがあってはならない企業のアプリケーション:)

http://i.imgur.com/1vCnYJW.png

4

のバックグラウンドサービスを作成することができますので、一部の人々はこれを行う理由はありますそしてAlarmManager

の1-によってあなたは

AlarmManager

で呼び出すためのBroadcastReceiverクラスを作成する必要があることを呼び出し
public class AlarmReceiver extends BroadcastReceiver 

{ 
    /** 

    * Triggered by the Alarm periodically (starts the service to run task) 

    * @param context 

    * @param intent 

    */ 

    @Override 

    public void onReceive(Context context, Intent intent) 

    { 

     Intent i = new Intent(context, AlmasService.class); 

     i.putExtra("foo", "AlarmReceiver"); 

     context.startService(i); 

    } 

} 

2 - あなたは

public class AlmasService extends IntentService 

{ 

    public Context context=null; 

    // Must create a default constructor 
    public AlmasService() { 

     // Used to name the worker thread, important only for debugging. 
     super("test-service"); 

    } 

    @Override 

    public void onCreate() { 

     super.onCreate(); // if you override onCreate(), make sure to call super(). 

    } 


    @Override 
    protected void onHandleIntent(Intent intent) { 

     context=this; 
     try 

     { 

      Thread.sleep(5000); 

     } 

     catch (InterruptedException e) 

     { 

      e.printStackTrace(); 

     } 



     String val = intent.getStringExtra("foo"); 

     // Do the task here 
     Log.i("MyTestService", val); 

    } 

} 

3 - あなたがマニフェスト

上のサービスとして、受信機とAlmasServiceとしてAlarmReceiverを追加する必要がAlarmReceiver

で呼び出すためのIntentServiceクラスを作成する必要があります
<service 
     android:name=".ServicesManagers.AlmasService" 
     android:exported="false"/> 

    <receiver 
     android:name=".ServicesManagers.AlmasAlarmReceiver" 
     android:process=":remote" > 
    </receiver> 

4 - 今、あなたがサービスを開始し、あなたがこの質問のために働いていた答えを受け入れることができますしてくださいMainActivity

public class MainActivity extends AppCompatActivity 
{ 
    public static final int REQUEST_CODE = (int) new Date().getTime(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     scheduleAlarm(); 
    } 

    public void scheduleAlarm() 
    { 
     // Construct an intent that will execute the AlarmReceiver 
     Intent intent = new Intent(getApplicationContext(), AlmasAlarmReceiver.class); 
     // Create a PendingIntent to be triggered when the alarm goes off 
     final PendingIntent pIntent = PendingIntent.getBroadcast(
       this, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     // Setup periodic alarm every every half hour from this point onwards 
     long firstMillis = System.currentTimeMillis(); // alarm is set right away 
     AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
     // First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP 
     // Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_DAY 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis, (long) (1000 * 60), pIntent); 



    } 
} 
関連する問題