6

私は現在Androidプロジェクトに取り組んでおり、サービスを開始しようとしています。サービスがコードの実行を開始すると、いくつかのものを初期化します。

以下は私がサービスに使用しているコードです。

Context context;
    PowerManager.WakeLock wakeLock;

    public PowerDetectionService(Context context)
    {
        this.context = context;
    }

    public PowerDetectionService()
    {}

    public void onCreate()
    {
        super.onCreate();
        PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay");
    }

    public void onStart(Intent intent, int startId)
    {
        super.onStart(intent, startId);
        PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay");
    }

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    public void receivedPowerConnected()
    {
        try
        {
            Toast.makeText(context, "Power connected", Toast.LENGTH_LONG).show();
            wakeLock.acquire();
        }
        catch (Exception ex)
        {
            Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show();
        }
    }

    public void receivedPowerDisconnected()
    {
        try
        {
            Toast.makeText(context, "Power disconnected", Toast.LENGTH_LONG).show();
            wakeLock.release();
        }
        catch (Exception ex)
        {
            Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show();
        }
    }

コードのそのビットがoncreateまたはonstartで実行されることはないため、ウェイクロックは常にnullです。私はそれをbind関数に入れてみましたが、それでも喜びはありません。

Androidの設定に入ると、アプリでサービスが実行されていることがわかりますが、何かが機能する前に、そのコードを初期化する必要があります。

あなたが提供できるどんな助けにも感謝します。

更新 前のコメントのおかげで関数が呼び出されていることを発見しました。何らかの理由でデバッガーが起動しません。

以下は、要求に応じてサーバーを作成する方法を示すコードです。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startService(this);
}

public void onResume()
{
    super.onResume();
    startService(this);
}

private void startService(Context context)
{
    Intent service = new Intent(context, PowerDetectionService.class);
    context.startService(service);
}

UPDATE 2 以下に要求されているように、サービスを開始してウェイクロックを実行するすべてのコードがあります。

以下は、サービスを開始する主な活動です

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        StartPowerService(this);
        //getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    public void onResume()
    {
        super.onResume();
        StartPowerService(this);
    }

    private void StartPowerService(Context context)
    {
        Intent service = new Intent(context, PowerDetectionService.class);
        startService(service);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            //case android.R.id.home:
            //    NavUtils.navigateUpFromSameTask(this);
            //    return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

以下はサービスのクラスです

public class PowerDetectionService extends Service {

    Context context;
    PowerManager.WakeLock wakeLock;

    public PowerDetectionService(Context context)
    {
        this.context = context;
    }

    public PowerDetectionService()
    {}

    public void onCreate()
    {
        super.onCreate();
        Log.d("SERVICE", "ON CREATE CALLED");
        PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay");
    }

    public int OnStartCommand(Intent intent, int flags, int startId)
    {
        Log.d("SERVICE", "ONSTARTCOMMAND Called");
        PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay");
        return START_STICKY;
    }

    public void onStart(Intent intent, int startId)
    {
        super.onStart(intent, startId);
        Log.d("SERVICE", "ON START CALLED");
        PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay");
    }

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    public void receivedPowerConnected()
    {
        try
        {
            Toast.makeText(context, "Power connected", Toast.LENGTH_LONG).show();
            wakeLock.acquire();
        }
        catch (Exception ex)
        {
            Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show();
        }
    }

    public void receivedPowerDisconnected()
    {
        try
        {
            Toast.makeText(context, "Power disconnected", Toast.LENGTH_LONG).show();
            wakeLock.release();
        }
        catch (Exception ex)
        {
            Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show();
        }
    }
}

そして、以下はメインフェストファイルです。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.BoardiesITSolutions.ScreeenStay"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="PowerDetectionService"
            android:process=":ScreenStay"
            android:icon="@drawable/ic_launcher"
            android:label="Screen Stay">
        </service>
        <receiver android:name="BroadcastReceiveDetection">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

お役に立てれば。

4

3 に答える 3

9

別のプロセスでサービスを開始しています。

    <service android:name="PowerDetectionService"
        android:process=":ScreenStay"
        android:icon="@drawable/ic_launcher"
        android:label="Screen Stay">

デバッガーはメインプロセスに接続されています。新しいものが起動すると、デバッガーが接続されていないため、ブレークポイントは無視されます。リモートプロセスをデバッグする場合は、DDMSパースペクティブでEclipseを介してデバッグできます。デバイスの下で、そのプロセスを見ることができます。次に、1つを選択して、選択したプロセスのデバッグ(緑色のバグアイコン)を押すことができます。これは、ある時点でアプリのデバッグを開始したい場合にも役立ちます。

デバッグonCreate()に関しては、プロセスの開始後、前onCreate()に呼び出されるデバッガーをアタッチする必要があります。たとえば、デバッガーを接続できるように、いくつかを数秒間Thread.sleep()の先頭に置くことができます。onCreate()

于 2013-05-21T12:58:52.850 に答える
3

どのクラスを拡張していますか?サービス?

この方法onStart()は、古いAndroidバージョン(<2.0)でのみ使用されます。より最近のバージョンについては、以下のように使用する必要がありますonStartCommand()

@Override
public int onStartCommand(Intent intent, int flags, int startId)

START_STICKYまた、コードの実行後もサービスを実行し続けるには、上記のメソッドから戻る必要があり ます。サービスが存続しない場合、PowerManager.FULL_WAKE_LOCKは解放されます。wakeLockおそらく、静的にすることもできます。

サービスの使用を開始するには:

    Intent i=new Intent(this, PowerDetectionService.class);
    startService(i);

-編集済み--

ここでのトピックに従って:getApplication()とgetApplicationContext()を使用してコンテキストを取得すると、異なるContextオブジェクトを取得する場合がありますgetApplicationContext()。次の行を変更してみてください。

    PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE);

に:

    PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);

卒業します。

于 2012-10-26T22:33:34.777 に答える
0

ただのメモ:

onStart()メソッドは非推奨であり、onStartCommand()代わりに使用する必要があります(これは、でサービスを開始した場合にのみ呼び出されますContext.startService()

ただし、onCreate()サービスが実行されている場合は呼び出す必要があります(ただし、1回のみ)。

于 2012-10-26T22:37:33.513 に答える