2011-10-07 18 views
74

Stack Exchangeなどで見たことのあるものから、Android OSの起動時にIntentServiceを起動するための設定がすべて正しくなっています。残念ながら、起動時に起動していないため、エラーは発生していません。たぶん専門家が助けることができる...Android - 起動時にサービスを開始

マニフェスト:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.phx.batterylogger" 
    android:versionCode="1" 
    android:versionName="1.0" 
    android:installLocation="internalOnly"> 

<uses-sdk android:minSdkVersion="8" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.BATTERY_STATS" /> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <service android:name=".BatteryLogger"/> 
    <receiver android:name=".StartupIntentReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
</application> 

</manifest> 

スタートアップのためのBroadcastReceiver:

package com.phx.batterylogger; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class StartupIntentReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent serviceIntent = new Intent(context, BatteryLogger.class); 
     context.startService(serviceIntent); 
    } 
} 

UPDATE:私はちょうど約すべての以下の提案を試みたが、私はログを追加StartupIntentReceiverのonReceiveハンドラにLog.v("BatteryLogger", "Got to onReceive, about to start service");のようなメッセージが記録され、何も記録されません。だから、それはBroadcastReceiverにさえしていません。

私はAPKをデプロイして正しくテストしていると思うが、EclipseでDebugを実行するだけで、\ BatteryLogger \ bin \ BatteryLogger.apkのXoomタブレットにコンソールが正常にインストールされているようだ。次に、テストするために、私はタブレットを再起動し、DDMSのログを見て、OS設定でRunning Servicesを確認します。これはすべて正しいと思いますか、または何か不足していますか?繰り返しますが、どんな助けでも大歓迎です。

+1

あなたはどんな問題を抱えていますか、UIを取得していませんか? –

+0

サービスは決して始まらない、それは問題です。 – Gady

+0

サービスが開始されていないことを知る方法、ログなどを印刷したことがありますか? –

答えて

230

は、自動起動アプリケーション

AndroidManifestファイル

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="pack.saltriver" android:versionCode="1" android:versionName="1.0" 
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 

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

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

     <activity android:name=".hello"></activity> 
     <service android:enabled="true" android:name=".service" /> 
    </application> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> 
</manifest> 

autostart.java

public class autostart extends BroadcastReceiver 
{ 
    public void onReceive(Context context, Intent arg1) 
    { 
     Intent intent = new Intent(context,service.class); 
     context.startService(intent); 
     Log.i("Autostart", "started"); 
    } 
} 

service.java

の完全な例であります
public class service extends Service 
{ 
    private static final String TAG = "MyService"; 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
    public void onDestroy() { 
     Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onDestroy"); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) 
    { 
     Intent intents = new Intent(getBaseContext(),hello.class); 
     intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intents); 
     Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onStart"); 
    } 
} 

hello.java - これはApplicatonを1回実行した後にデバイスを起動するたびにポップアップ表示されます。

public class hello extends Activity 
{ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Toast.makeText(getBaseContext(), "Hello........", Toast.LENGTH_LONG).show(); 
    } 
} 
+6

+1完全な例です。たぶん私はintHandleIntentでIntentServiceを普通の古いサービスに変更する必要があります – Gady

+4

これは最終的にそれを解決しました。問題は、私のサービスが普通の古いサービスではなくIntentServiceであり、サービスコードでエラーが発生したことです。この回答の徹底とAndroidへのログインは、私の問題を解決するのに役立ちました。詳しい例については – Gady

+2

+1。これは活動なしでも機能しますか? – balas

1

mineと非常によく似ていますが、私は受信機のための完全なパッケージ名を使用します。

<receiver android:name=".StartupIntentReceiver"> 

私が持っている:

<receiver android:name="com.your.package.AutoStart"> 
+0

修正しませんでした。しかし、ありがとう。 – Gady

+0

あなたの問題を並べ替えるのはちょっとだったので、こんにちは世界の例をよく投稿しました。 –

1

私はあなたが知っている、完全なパッケージなしで成功を収めてきましたコールチェーンが中断されている場所Log()でデバッグすると、どの時点で機能しなくなりますか?

私はそれがあなたのIntentServiceにあるかもしれないと思うが、これはすべて上手く見える。さてここで

+0

'Log.v(" BatteryLogger "、" onReceiveに着手しました。サービスを開始しようとしています ");をonReceiveハンドラに追加しました。リスナーが失敗しています(?) – Gady

+0

電話機の起動時にブロードキャスト受信機を起動させるにはどうすればよいですか?ありがとう! –

+0

少年。私は数年後にアンドロイドに触れていません。申し訳ありません@ルチア – Phix

3

次のように動作します。私は確認した。あなたの問題はどこか別のものかもしれません。

public class MyReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("TAG", "MyReceiver"); 
     Intent serviceIntent = new Intent(context, Test1Service.class); 
     context.startService(serviceIntent); 
    } 
} 




public class Test1Service extends Service { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d("TAG", "Service created."); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.d("TAG", "Service started."); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 
     Log.d("TAG", "Service started."); 
    } 
    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
} 




<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.test" 
     android:versionCode="1" 
     android:versionName="1.0" 
     android:installLocation="internalOnly"> 
    <uses-sdk android:minSdkVersion="8" /> 

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

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.BATTERY_STATS" 
    /> 
<!--  <activity android:name=".MyActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER"></category> 
      </intent-filter> 
     </activity> --> 
     <service android:name=".Test1Service" 
        android:label="@string/app_name" 
        > 
     </service> 
     <receiver android:name=".MyReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 
+0

ありがとうございますが、それでも動作しませんでした。ログはStartupIntentReceiverにログを出力することを示していません。他のアイデア? – Gady

+0

私の質問の更新もご覧ください。 – Gady

+1

あなたのコードはエミュレータで動作していますか?あなたはエミュレータでインテントを受け取ることができますか? – Vivek

2

起動後にデバイスがスリープ状態になるため、サービスが完了する前にシャットダウンされている可能性があります。最初にウェイクロックを取得する必要があります。幸いにも、Support library gives us a classはこれを行うには:

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // This is the Intent to deliver to our service. 
     Intent service = new Intent(context, SimpleWakefulService.class); 

     // Start the service, keeping the device awake while it is launching. 
     Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); 
     startWakefulService(context, service); 
    } 
} 

そして、あなたのサービスでは、ウェイクロックを解除してください:

@Override 
    protected void onHandleIntent(Intent intent) { 
     // At this point SimpleWakefulReceiver is still holding a wake lock 
     // for us. We can do whatever we need to here and then tell it that 
     // it can release the wakelock. 

... 
     Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime()); 
     SimpleWakefulReceiver.completeWakefulIntent(intent); 
    } 

WAKE_LOCK権限を追加することを忘れないでください:

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

私は同じ問題を抱えています。私を助けてもらえますか?ありがとう! http://stackoverflow.com/questions/35373525/starting-my-service –

関連する問題