Rumah >Java >javaTutorial >Mengapa Perkhidmatan Android Saya Tidak Dimulakan semasa But?

Mengapa Perkhidmatan Android Saya Tidak Dimulakan semasa But?

Barbara Streisand
Barbara Streisandasal
2024-12-12 20:42:18764semak imbas

Why Isn't My Android Service Starting on Boot?

Mulakan Perkhidmatan pada But Android

Melaksanakan konfigurasi yang betul untuk memulakan perkhidmatan secara automatik semasa but Android OS adalah penting. Walaupun nampaknya semuanya telah disediakan dengan betul, mungkin terdapat isu asas yang menghalang gelagat yang diingini.

Manifest Android

Semak Manifes Android yang disediakan:

<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>

Pastikan tindakan BOOT_COMPLETED didaftarkan dalam IntentReceiver.

BroadcastReceiver for Startup

Seterusnya, semak StartupIntentReceiver:

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);
    }
}

Penerima ini sepatutnya mendengar tindakan BOOT_COMPLETED dikehendaki perkhidmatan.

Menyelesaikan masalah

Jika perkhidmatan tidak bermula semasa but, pertimbangkan langkah berikut:

  • Sahkan bahawa log menunjukkan penerima sedang menerima siaran BOOT_COMPLETED.
  • Periksa sama ada perkhidmatan sasaran diisytiharkan dengan betul dan dikonfigurasikan dalam Manifes.
  • Pastikan perkhidmatan sasaran tidak dilumpuhkan atau dioptimumkan oleh sistem.
  • Pertimbangkan untuk menggunakan Context.startForegroundService(Intent intent, int notificationId) API untuk memulakan perkhidmatan dalam latar depan (tersedia dalam tahap API 26 dan di atas).

Contoh Lengkap

Untuk contoh menyeluruh bagi aplikasi AutoStart, rujuk kod berikut coretan:

AndroidManifest

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

    <uses-permission android:name="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>
</manifest>

autostart.java

public class autostart extends BroadcastReceiver 
{
    public void onReceive(Context context, Intent arg1) 
    {
        Intent intent = new Intent(context,service.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent);
        } else {
            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

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();
    }
}

Melaksanakan langkah ini harus memastikan perkhidmatan Android anda berjaya dimulakan semasa but OS.

Atas ialah kandungan terperinci Mengapa Perkhidmatan Android Saya Tidak Dimulakan semasa But?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn