Application (Service) ohne Activity starten

  • 6 Antworten
  • Letztes Antwortdatum
M

mCounter

Neues Mitglied
0
Hallöchen...
ich wollte mal fragen, ob es möglich ist eine Application in der ich einen Service erstellt habe zu starten, ohne dafür eine Activity erstellen zu müssen.

Wenn das geht, wie würde dann die Manifest-Datei ungefähr aussehen?
 
Moin,
das einzige was mir dazu einfällt, wäre einen Boot Receiver zu erstellen.
Dann wird der Service beim Starten des Handys aufgerufen. Anschließend kannst du ihn ja via AlarmManager erneut aufrufen lassen.

Willst du ihn ohne obigen Umweg starten, sieht's glaub ich eher schlecht aus - aber keine Garantie ;)

Greets,
Max
 
Das is ne gute Idee allerdings gibt es da ein kleines Problem.
Da ich nich nie mit nem Boot Receiver gearbeitet habe, habe ich mir erstmal etwas zum testen zurechtgebastelt.

Hier mal die Quellcodes...

Booting.java:
Code:
package com.example.booting;

import java.io.File;
import java.io.FileNotFoundException;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import java.util.Formatter;

public class Booting extends BroadcastReceiver {
    
    private File file;
    private Formatter format;
    
    @Override
    public void onReceive(Context context, Intent intent) {
        file = new File("/sdcard/Pictures/Screenshots/text.txt");
        
        try {
            
            format = new Formatter(file);
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

}
AndroidManifest.xml:
Code:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.booting"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <receiver android:name="com.example.booting.Booting"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <category android:name="android.intent.category.HOME"/>
            </intent-filter>
        </receiver>
        
    </application>

</manifest>
Wie man sieht soll die App erstmal nichts weiter machen als eine Datei namens "text.txt" im Screenshots-Ordner erstellen (Ist zwar nicht sonderlich sinnvoll allerdings sehe ich so, ob alles funktioniert hat oder nicht).

Wenn ich die app jetzt allerdings ausführe und mein Smartphone neu starte, dann passiert nichts.

Deswegen jetzt meine Frage, benötige ich evtl. für den Boot Receiver noch weitere Permissions oder liegt das Problem wo anders?

Edit:
Ich habe jetzt noch folgende Zeile ins Manifest hinzugefügt:
Code:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
ohne Erfolg.
 
Zuletzt bearbeitet:
mCounter schrieb:
<receiver android:name="com.example.booting.Booting"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME"/>
</intent-filter>
</receiver>
Servus,
So gut kenne ich mich da auch nicht aus - wollte dir lediglich den Tip geben ;)
Ich könnte mir vorstellen, dass hier wegen der Intent-Kategorie ein Problem vorliegt...
Aber nur eine Vermutung.

Und lass die Arbeit von nem Service erledigen. Sprich der Receiver startet in onReceive einfach den Service, der dann sämtliche Speicherei oder was auch immer erledigt.

Btw: Du musst dein Handy nicht neu starten - Feuer einfach den Broadcast Intent mittels ADB shell:
am broadcast -a <INTENT_NAME> -n <your.package>/
;)

Vielleicht hilft dir das ja ein wenig.
Greets,
Max
 
Btw: Du musst dein Handy nicht neu starten - Feuer einfach den Broadcast Intent mittels ADB shell:
am broadcast -a <INTENT_NAME> -n <your.package>/

Ja, hab schon ein paar mal was bzgl. ADB überflogen aber mich noch nie wirklich damit beschäftigt, das sollte ich unbedingt mal nachholen.

Wie dem auch sei, danke für den Tipp, hab mir gleich erstmal ne passende Batch-Datei erstellt. ^^

Doch nun zu meiner App. Ich habe nun einen Service hinzugefügt, und die category des Receivers von "HOME" auf "DEFAULT" gesetzt, desweiteren werden jetzt keine Dateien mehr erstellt sondern einfach nur nachrichten mit System.out.println() ausgegeben. Meine Dateien sehen jetzt folgendermaßen aus.

Booter.java:
Code:
package com.example.tester;

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

public class Booter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("checkTest Booter_onReceive");
        
        Intent service = new Intent(context, MyService.class);
        context.startService(service);
    }

}

MyService.java:
Code:
package com.example.tester;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class MyService extends Service {
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    
    @Override
    public void onCreate() {
        System.out.println("checkTest MyService_onCreate");
        
        super.onCreate();
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("checkTest MyService_onStart");
        
        return super.onStartCommand(intent, flags, startId);
    }
    
    @Override
    public void onDestroy() {
        System.out.println("checkTest MyService_onDestroy");
        
        super.onDestroy();
    }

}

AndroidManifest.xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tester"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver
            android:name="com.example.tester.Booter"
            android:enabled="true" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

        <service android:name="com.example.tester.MyService" >
        </service>

    </application>

</manifest>

Leider wird mir nichts im LogCat ausgegeben, weil die App gar nicht erst gestartet wird. Ich habe auch schon probiert, dem Receiver anstatt der category DEFAULT die category LAUNCHER zuzuweisen, allerdings ohne Erfolg.

Ich hatte das ganze auch mal so ummodeliert, dass ich die App zuerst mit einer Activity starte. Dann funktioniert alles tadellos. Selbst wenn ich die Einträge für die Activity aus der AndroidManifest wieder entferne werden mir meine System.out.println()-Einträge im LogCat bei einem ReBoot angezeigt, solange die Ausführung der App auf dem Smartphone nicht gestoppt wurde.

Ich hab mich nun schon durchgegoogelt und selber rumprobiert, bekomme es aber leider nicht zustande.

Jetzt also meine Frage, wie bekomme ich diese App ohne eine Activity zum laufen?
 
Ähm sorry harlow006, ich versteh deine Aussage jetzt nicht ganz, worauf beziehst du das jetzt grade?

Der ursprüngliche Beitrag von 14:39 Uhr wurde um 15:35 Uhr ergänzt:

OK, ich fange am besten nochmal etwas kleiner an...

Den Service lasse ich erstmal weg... ich möchte nur erstmal, dass mir der Broadcast Receiver mittels System.out.println() den Text "checkTest Booter_onReceive" im LogCat ausgeben lassen.

Wie müsste meine Manifest-Datei aussehen, damit das funktioniert?
 
Jede APP muss zumindest einmal sichtbar werden bevor sie komplett im Hintergrund laufen darf.
Folglich musst du einfach nur ne Activity hinzufügen und einmal öffnen.. Danach läuft dein service ;)
 

Ähnliche Themen

AnnaBauer21
Antworten
14
Aufrufe
1.191
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten