Android - Açılışta hizmeti başlat


107

Stack Exchange'de ve başka yerlerde gördüğüm her şeyden, Android işletim sistemi önyüklendiğinde bir IntentService başlatmak için her şeyi doğru bir şekilde ayarladım. Maalesef önyüklemede başlamıyor ve herhangi bir hata almıyorum. Belki uzmanlar yardımcı olabilir ...

Belirgin:

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

Başlangıç ​​için 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);
    }
}

GÜNCELLEME : Aşağıdaki önerilerin hemen hemen hepsini denedim Log.v("BatteryLogger", "Got to onReceive, about to start service");ve StartupIntentReceiver'ın onReceive işleyicisi gibi günlük kaydı ekledim ve hiçbir şey günlüğe kaydedilmedi. Yani BroadcastReceiver'a bile ulaşmıyor.

Sanırım APK'yi dağıtıyorum ve doğru bir şekilde test ediyorum, sadece Eclipse'de Debug çalıştırıyorum ve konsol, \ BatteryLogger \ bin \ BatteryLogger.apk adresindeki Xoom tabletime başarıyla yüklediğini söylüyor. Daha sonra test etmek için tableti yeniden başlatıyorum ve ardından DDMS'deki günlüklere bakıyorum ve işletim sistemi ayarlarında Çalışan Hizmetleri kontrol ediyorum. Bunların hepsi doğru mu yoksa bir şey mi kaçırıyorum? Yine, herhangi bir yardım çok takdir edilmektedir.


1
ne problem yaşıyorsun, herhangi bir kullanıcı arayüzü almıyorsun ..?
Lalit Poptani

1
Hizmet asla başlamaz, sorun budur.
Gady

hizmetinizin başlamadığını nasıl anladınız, Günlükleri veya buna benzer herhangi bir şeyi yazdırdınız mı ..?
Lalit Poptani

1
Çalışmadığını görmek için günlüklere ihtiyacınız yok. Android işletim sistemi çalışan hizmetleri ortaya çıkarır. Ancak, bir hata olup olmadığını görmek için günlük kaydını kullanmak akıllıca olacaktır. Bir hata meydana gelirse bunun context.startService () 'den önce gerçekleştiğini tahmin etmeye cesaret ediyorum.
Tony

1
Log.v("BatteryLogger", "Got to onReceive, about to start service");OnReceive işleyicisine ekledim ve hiçbir zaman günlüklerde görünmüyor. Yani dinleyici başarısız oluyor (?)
Gady

Yanıtlar:


302

İşte bir AutoStart Uygulamasının eksiksiz bir örneği

AndroidManifest dosyası

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

    <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 - Bu, Applicaton'ı bir kez çalıştırdıktan sonra cihazı her başlattığınızda açılır.

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

10
Tam örnek için +1. Belki de onHandleIntent ile IntentService'imi eski bir Hizmet olarak değiştirmeliyim
Gady

6
Bu nihayetinde sorunu çözdü. Sorun, hizmetimin düz eski Hizmet yerine bir IntentService olması ve hizmet kodundaki hataların bir kombinasyonuydu. Bu cevabın titizliği ve Android'e giriş yapmak sorunlarımı çözmeme yardımcı oldu.
Gady

3
Ayrıntılı örnek için +1. Bu da bir aktivite olmadan çalışır mıydı?
balas

1
onStart () geri araması kullanımdan kaldırıldı. Bunun yerine onStartCommand () kullanmalısınız.
mmBs

1
@mmBs bu cevap neredeyse 5 yaşında, bu yüzden açık
Lalit Poptani

3

Hizmetiniz, önyüklemeden sonra aygıtın uykuya geçmesi nedeniyle tamamlanmadan kapatılıyor olabilir. Önce bir uyandırma kilidi almanız gerekir. Neyse ki, Destek kitaplığı bize bunu yapmamız için bir sınıf veriyor :

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

ardından, Hizmetinizde uyandırma kilidini açtığınızdan emin olun:

    @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 iznini eklemeyi unutmayın:

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

1
Ben de aynı sorunu yaşıyorum. Bana yardım edebilir misin? Teşekkürler! stackoverflow.com/questions/35373525/starting-my-service
Ruchir Baronia

2

Aşağıdaki çalışmalıdır. Doğruladım. Senin sorunun başka bir yerde olabilir.

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>

Bunun için teşekkürler ama yine de işe yaramadı. Günlükler bile bunun StartupIntentReceiver'a ulaştığını göstermiyor. Başka fikrin var mı?
Gady

1
Kodunuz emülatörde mi çalışıyor? Emülatörde niyet alabiliyor musunuz?
Vivek

Öykünücüde test ettim ve DDMS'de bir hata alıyorum, ancak en azından hizmet başlatmaya çalışıyor gibi görünüyor, ancak Log()ifadelerimden hiçbiri orada değil ve öykünücü cihaz hizmetimi işletim sistemi ayarlarında çalışıyor olarak göstermiyor. İşte System.err - at com.phx.batterylogger$1.onReceive(BatteryLogger.java:43)DDMS'deki hata: Bu, sorunun BatteryLogger hizmetimin 43. satırında olduğu anlamına mı geliyor?
Gady

2

Cihaz yeniden başlatıldığında uygulamanızın iyi çalışmasını sağlamanın bir yolunu buldum, başarılı olmak için lütfen aşağıdaki adımları izleyin.

AndroidManifest dosyası

<?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">
<uses-permission 
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

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

<activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".UIBootReceiver" android:enabled="true" 
    android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
     <service android:name=".class_Service" />
</application>

UIBootReceiver

public class UIBootReceiver extends BroadcastReceiver {

private static final String TAG = "UIBootReceiver";
@Override

    public void onReceive(Context context, Intent arg1)
    {
        Toast.makeText(context, "started", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(context,class_Service.class);
        context.startService(intent);
    }
  }

Bu, arka planda istikrarlı bir şekilde çalışabilmeniz için bu uygulama için pil tasarrufunu yönetmenize gerek kalmaması için izin istiyor.

MainActivity sınıfının onCreate () öğesinde bu kodu bildirin:

   Intent myIntent = new Intent();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        myIntent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        myIntent.setData(Uri.parse("package:" + 
   DeviceMovingSpeed.this.getPackageName()));
    }
    startActivity(myIntent);

1

Benimkine çok benziyor ancak alıcı için tam paket adını kullanıyorum:

<receiver android:name=".StartupIntentReceiver">

Sahibim:

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

Evet, sorununuzu çözmek biraz zordu, bu yüzden bir merhaba dünya örneği yayınlasanız iyi olur.
Lalit Poptani

1

Tam paket olmadan başarılı oldum, çağrı zincirinin nerede kesintiye uğradığını biliyor musunuz? Log()'S ile hata ayıklama yaparsanız , hangi noktada artık çalışmıyor?

Sanırım IntentService'inizde olabilir, her şey yolunda görünüyor.


Log.v("BatteryLogger", "Got to onReceive, about to start service");OnReceive işleyicisine ekledim ve hiçbir zaman günlüklerde görünmüyor. Yani dinleyici başarısız oluyor (?)
Gady

Telefon açıldığında yayın alıcısının başlamasını sağlayan nedir? Teşekkürler!
Ruchir Baronia

Oğlan. Birkaç yıldır android'e dokunmadım. Özür dilerim @Ruchir
Phix

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.