Как получить доступ к контексту приложения из прослушивателя Android - PullRequest
2 голосов
/ 15 ноября 2011

У меня есть виджет Android (расширяет класс AppWidgetProvider), и я пытаюсь получить доступ к контексту приложения из прослушивателя службы. Мне нужно получить доступ к контексту, чтобы я мог изменить обои приложения. Вот ошибка, которую я получаю: Cannot refer to a non-final variable context inside an inner class defined in a different method. Я попробовал предлагаемое исправление, чтобы изменить контекст модификатора на Final, но созданное растровое изображение возвращается как ноль. Может кто-нибудь предложить подходящий способ справиться с этим? Вот фрагмент кода:

private void startWallpaperService(Context context) {
    Intent wpIntent = new Intent(context, Wallpaper_Service.class);
    context.startService(wpIntent);

    Wallpaper_Service wpSrv = Wallpaper_Service.getService();

    if(wpSrv != null) {
        Log.i(TAG, "Wallpaper Service is not null");

        Wallpaper_Service.repetitionInterval=30*1000;

        wpSrv.setWallpaperListener(new Wallpaper_Service.WallpaperListener() {
            @Override
            public void onWallpaperUpdate(int imageId) {
                if(wpm == null)
                    Log.w(TAG, "wpm or context is null");
                else {
                    Bitmap background = BitmapFactory.decodeResource(context.getResources(), R.drawable.image1);  // I get a syntax error here
                    if(background==null){
                        Log.w(TAG, "background is null");
                    }else{

                        try {
                            wpm.setBitmap(background);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }
        });

    } else {
        Log.e(TAG, "Wallpaper Service failed");
    }
    }

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Можете ли вы просто создать окончательный экземпляр контекста приложения в третьей строке вашего метода, например:

final Context ctx  = context.getApplicationContext();

или

final Context ctx  = context;

И я полагаю, теперь вы можете использовать "ctx""в вашем внутреннем методе замедления.

Это просто звучит как ограничение синтаксиса Java, а не проблема кода.

Надеюсь, это поможет.

-serkan

1 голос
/ 05 января 2012

В 95% случаев и всегда в Слушателях вы можете напрямую использовать getApplicationContext () для получения контекста.

Если вам нужен контекст для получения системных ресурсов, используйте

Resources.getSystem().getString(R.string.somestuffofmyown) 

Вы можете использовать его везде в вашем приложении!

...