Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “实时壁纸”在我关闭后仍在运行_Java_Android_Live Wallpaper - Fatal编程技术网

Java “实时壁纸”在我关闭后仍在运行

Java “实时壁纸”在我关闭后仍在运行,java,android,live-wallpaper,Java,Android,Live Wallpaper,我正在研究Android上的实时壁纸。我注意到,尽管我选择了其他墙纸,但我的墙纸仍在运行。为了重现这种行为,我将使用一个简单的实时壁纸。 舱单是: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.wallpaper.test" android:versionCode="1" android:versionName="1.0" > <

我正在研究Android上的实时壁纸。我注意到,尽管我选择了其他墙纸,但我的墙纸仍在运行。为了重现这种行为,我将使用一个简单的实时壁纸。 舱单是:

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

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="23" />

    <uses-feature android:name="android.software.live_wallpaper" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <service
            android:name=".DemoWallpaperService"
            android:label="Demo Live Wallpaper"
            android:permission="android.permission.BIND_WALLPAPER" >
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>

            <meta-data
                android:name="android.service.wallpaper"
                android:resource="@xml/wallpaper" />
        </service>
    </application>

</manifest>
编译后,在设备上部署并选择它

现在我选择另一张墙纸,所以我希望墙纸过程会结束。如果转到DDMS,我会看到进程仍在运行:

还有很多线程还活着:

这是正确的,还是壁纸关闭不正确


谢谢

经过调查,我发现,尽管调用了服务的
onDestroy
方法,但墙纸仍然存在。进程被放入缓存的进程中。如果您重新选择它,则可以更快地恢复它

当内存被占用时,进程将被终止。

是否调用了您的
onDestroy()
?是的,onDestroy()调用正确。
package org.wallpaper.test;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.view.SurfaceHolder;

public class DemoWallpaperService extends WallpaperService {
    @Override
    public Engine onCreateEngine() {
        Log.i("DemoWallpaperService","DemoWallpaperService > onCreateEngine");      
        return new DemoWallpaperEngine();
    }

    @Override
    public void onCreate() {
        Log.i("DemoWallpaperService","DemoWallpaperService > onCreate");    
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        Log.i("DemoWallpaperService","DemoWallpaperService > onDestroy");   
        super.onDestroy();
    }

    private class DemoWallpaperEngine extends Engine {
        private boolean mVisible = false;
        private final Handler mHandler = new Handler();
        private final Runnable mUpdateDisplay = new Runnable() {
            @Override
            public void run() {
                draw();
            }
        };

        private void draw() {
            SurfaceHolder holder = getSurfaceHolder();
            Canvas c = null;
            try {
                c = holder.lockCanvas();
                if (c != null) {
                    Paint p = new Paint();
                    p.setTextSize(20);
                    p.setAntiAlias(true);
                    String text = "system time: " + Long.toString(System.currentTimeMillis());
                    float w = p.measureText(text, 0, text.length());
                    int offset = (int) w / 2;
                    int x = c.getWidth() / 2 - offset;
                    int y = c.getHeight() / 2;
                    p.setColor(Color.BLACK);
                    c.drawRect(0, 0, c.getWidth(), c.getHeight(), p);
                    p.setColor(Color.WHITE);
                    c.drawText(text, x, y, p);
                }
            } finally {
                if (c != null)
                    holder.unlockCanvasAndPost(c);
            }
            mHandler.removeCallbacks(mUpdateDisplay);
            if (mVisible) {
                mHandler.postDelayed(mUpdateDisplay, 100);
            }
        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            mVisible = visible;
            if (visible) {
                draw();
            } else {
                mHandler.removeCallbacks(mUpdateDisplay);
            }
        }

        @Override
        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            draw();
        }

        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
            super.onSurfaceDestroyed(holder);
            mVisible = false;
            mHandler.removeCallbacks(mUpdateDisplay);
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            mVisible = false;
            mHandler.removeCallbacks(mUpdateDisplay);
        }
    }
}