Apps für Android programmieren leicht gemacht!
Ein DayDream unter Android erstellen

DayDream erstellen

Wir wollen uns heute gemeinsam einen DayDream erstellen.
Bei einem DayDream handelt es sich eigentlich um nicht mehr, als einen Bildschirmschoner für das eigene Smartphone. Diese DayDreams sind ab der Android Version 4.2 Jelly Bean (API 17) verfügbar.

DayDreams sind in Android standardgemäß deaktiviert und aufgrund dessen wahrscheinlich auch nicht sehr bekannt. Vorinstalliert sind dabei meist zwei verschiedene Diashows und ein Farbverlauf.

Wozu ein DayDream erstellen ?

Nutzbar wird ein DayDream erst, wenn man diesen auch aktiviert und das Smartphone auflädt.
Ein DayDream wird auf meinem Handy (Samsung Galaxy S5) nur angezeigt, wenn ich es in der Docking Station habe oder es über ein Kabel auflade und die Tastensperre nicht manuell betätige. Zusätzlich geht bei meinem Samsung immer der Bildschirm an, wenn der Akku bei 100% angekommen ist und anschließend greift DayDream.

Ich habe mir persönlich ein kleines DayDream erstellt, welches mir die Uhrzeit und das Droid-Lernen Logo anzeigt. Wenn ich mich nun schlafen lege und das Handy an die Ladestation stecke, greift DayDream und weckt mich mit unserem Logo und der Uhrzeit.

Worauf ist bei DayDream zu achten ? (WICHTIG)

Es ist von extremster Relevanz die Anzeige auf eurem Bildschirm zu wechseln!
Bitte zeigt die Uhrzeit (oder was auch immer) nicht immer an der selben Stelle an, sondern wechselt die Position. Ansonsten könnte es passieren, dass sich die Zahlen in euren Display einbrennen.
(So etwas sieht man häufig bei Vorführmodellen in Geschäften.)

Des Weiteren solltet ihr energiehungrige und rechenintensive Aufgaben vermeiden!
Das Smartphone hängt zwar an einer Steckdose, sollte aber dennoch halbwegs schnell laden und nicht überhitzen.

Ihr handelt auf eigenes Risiko.

Packen wir es an!

Wir wollen eine App für DayDream erstellen, die ein Logo und eine Uhrzeit beinhaltet. Sie soll natürlich konform meiner Vorgaben die Position der Zahlen und des Logos wechseln und nicht so energiehungrig sein.

Als erstes erstellen wir uns eine App in Android Studio mit einem beliebigen Package Namen und der Minimalanforderung von API 17. Vor dieser API gab es die Funktion DayDream nämlich nicht.

Anschließend erstellen wir eine Klasse Namens „DayDream“ und bearbeiten die Manifest.xml-Datei wie folgt:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="<!-- DER GEWÄHLTE PACKAGE NAME -->" >

    <application android:label="@string/app_name">
        <service
            android:name=".DayDream"
            android:exported="true"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DREAM_SERVICE">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.service.dreams.DreamService" />
            </intent-filter>
        </service>
    </application>
</manifest>

Schon erstellt die App keinen Icon mehr und registriert die Klasse „DayDream“ für den Service DayDream.
Ist DayDream aktiviert, wird von Android unsere erstellt Klasse „DayDream“ verwendet und damit unsere App geöffnet. So einfach geht es 😉

Nun, da die Klasse DayDream geöffnet werden soll müssen wir ein paar kleinere Anpassungen vornehmen.
In einer normalen App würde in der Hauptklasse, beim Öffnen der App, die Funktion „onCreate“ genutzt.
DayDream nutzt hier die Funktion „onAttechedToWindow“ zum Aufruf und zusätzlich „onDreamingStarted“.
Somit müssen wir an die Klasse „DayDream“ diese Funktionen vergeben.

public class DayDream extends DreamService {

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        //Diese Funktion wird als erstes aufgerufen und dient zur Vorbereitung des DayDreams
    }

    @Override
    public void onDreamingStarted (){
        super.onDreamingStarted();
        //Diese Funktion wird als zweites aufgerufen, sobald alles fertig geladen wurde. Hier können Animationen gestartet werden, etc.
    }

}

 

 

Des Weiteren stehen uns die Funktionen „onDreamingStopped“ und „onDetachedFromWindow“ zur Verfügung. Diese können genutzt werden, um zum Beispiel Animationen und Vorgänge zu stoppen, bevor DayDream gestoppt wird. Dadurch können wir Fehler beim Stoppen verhindern.

public class DayDream extends DreamService {

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        //Diese Funktion wird als erstes aufgerufen und dient zur Vorbereitung des DayDreams
    }

    @Override
    public void onDreamingStarted (){
        super.onDreamingStarted();
        //Diese Funktion wird als zweites aufgerufen, sobald alles fertig geladen wurde. Hier können Animationen gestartet werden, etc.
    }

    @Override
    public void onDreamingStopped(){
        super.onDreamingStopped();
        //Diese Funktion wird beim Schließen des DayDreams als erstes aufgerufen und dient zum Stopp von Vorgängen.
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        //Diese Funktion wird beim schließen des DayDreams als zweites aufgerufen und dient zur Bereinigung.
    }

}

 

Nun benötigen wir noch ein Layout, welches angezeigt werden soll:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/moveable">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView"
            android:cropToPadding="false"
            android:adjustViewBounds="false"
            android:src="@drawable/logo"
            android:scaleType="center"
            android:layout_centerHorizontal="true" />

        <TextClock
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:fontFamily="monospace"
            android:shadowColor="#800000"
            android:shadowDx="0"
            android:shadowDy="0"
            android:shadowRadius="8"
            android:textColor="@android:color/darker_gray"
            android:textSize="50sp"
            android:id="@+id/clock"
            android:format12Hour="hh:mm"
            android:layout_below="@+id/imageView" />

    </RelativeLayout>
</RelativeLayout>

Nun solltet ihr noch eine Bilddatei Namens „Logo“ in den Ordner „drawable“ schieben. Ihr könnt die Datei natürlich umbenennen wie es euch beliebt, vergesst aber nicht den neuen Namen auch in der Layout Datei einzutragen.

Schlussendlich muss das ganze Layout noch in einer Animation an einen beliebigen Ort verschoben werden. Ich habe dabei eine 7 Sekündige Animation, mit einer 1 sekündigen Pause gewählt.
Alles in allem sieht dies folgendermaßen aus:

import android.os.Handler;
import android.service.dreams.DreamService;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.RelativeLayout;

import java.util.Random;


public class DayDream extends DreamService {

    TranslateAnimation anim;
    private Handler handler;
    private RelativeLayout moveable;
    private int x1 = 0;
    private int x2;
    private int y1 = 0;
    private int y2;

    private int dauer = 7000;
    private int pause = 1000;

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        setFullscreen(true);
        setScreenBright(false);
        setContentView(R.layout.activity_clock);
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        anim.cancel();
        handler.removeCallbacks(animation);
    }

    @Override
    public void onDreamingStarted (){
        super.onDreamingStarted();

        moveable = (RelativeLayout) findViewById(R.id.moveable);
        handler = new Handler();
        handler.postDelayed(animation, 1000);

        RelativeLayout root = (RelativeLayout) findViewById( R.id.root );
        DisplayMetrics dm = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int statusBarOffset = dm.heightPixels - root.getMeasuredHeight();

        x2 = dm.widthPixels - moveable.getWidth();
        y2 = dm.heightPixels - statusBarOffset - moveable.getHeight();
    }

    @Override
    public void onDreamingStopped(){
        super.onDreamingStopped();
    }

    private Runnable animation = new Runnable() {
        @Override
        public void run() {
            Random r = new Random();
            int rx = r.nextInt(x2 - x1 + 1) + x1;
            int ry = r.nextInt(y2 - y1 + 1) + y1;

            moveViewTo(moveable, rx, ry);

            handler.postDelayed(this, dauer);
        }
    };

    private void moveViewTo( final View view, final int xDest, final int yDest ) {

        int originalPos[] = new int[2];
        view.getLocationOnScreen(originalPos);

        anim = new TranslateAnimation( 0, xDest - originalPos[0] , 0, yDest - originalPos[1]);
        anim.setDuration(dauer - pause);

        anim.setAnimationListener(new Animation.AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                view.setX((float)xDest);
                view.setY((float)yDest);
                view.clearAnimation();
            }
        });

        view.startAnimation(anim);
    }
}

 

 

Nun können wir unser eigenes DayDream erstellen und in den Einstellungen von Android aktivieren.
Wo genau ihr diese Einstellungsmöglichkeit findet erfahrt ihr am besten Im Internet, da jeder Hersteller seine Einstellungen anders verpackt. Meist findet man das Ganze aber unter Anzeige -> Bildschirmschoner oder DayDream.

DayDream Download


Wie immer als Anhang den Source Code zur Anleitung. Lade dir einfach den Code einer einfachen DayDream Anwendung, mit Logo, herunter.

DownloadLizenzbedingungen

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld