如何使用服务的上下文来创建ImageView

时间:2014-09-13 07:38:58

标签: java android

在Android上工作我正在创建一个SDK,用于创建服务以在客户端应用上显示叠加层。 我希望能够使用扩展Service类的类的上下文创建ImageViews和其他小部件。 这是我正在做的事情的缩减版。

public class MyService extends Service {

private WindowManager windowManager;
private ImageView myImage;


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

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    return START_NOT_STICKY;
}

public  void startService (Context ctx) {
    context = ctx;
    Intent intent = new Intent(ctx, MyService.class);
    ctx.startService(intent);
   // have also tried new Intent(this, MyService.class);
   // startService(intent);

}

public void displayMyImage () {
    if (chatHead == null) {
        chatHead = new ImageView(this);// explodes here due to null 
    }
    chatHead.setImageResource(R.drawable.myimage);

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.BOTTOM | Gravity.LEFT;
    params.x = 10;
    params.y = 100;


    windowManager.addView(chatHead, params);


}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (chatHead != null) windowManager.removeView(chatHead);
}

我在java.lang.NullPointerException

行找到chatHead = new ImageView(this)

我尝试此操作的原因来自本文http://www.piwai.info/chatheads-basics/,他们使用此文章在服务中创建图像视图。如何让它使用服务的上下文而不需要我传递客户端/主机应用程序的上下文?

编辑:只是从日志中输入完整错误

java.lang.NullPointerException
at android.content.ContextWrapper.getResources(ContextWrapper.java:89)
at android.view.View.<init>(View.java:3438)
at android.widget.ImageView.<init>(ImageView.java:114)

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是在项目的Application类下创建一个Global Application上下文。

在该应用程序类中编写以下代码以初始化您的上下文并从任何地方访问它。它将在您的应用程序启动时初始化。它将解决您的NPE

对于Application类代码:

公共类MyApplication扩展了Application {

private static Context context;

public void onCreate(){
    super.onCreate();
    MyApplication.context = getApplicationContext();
}

public static Context getAppContext() {
    return MyApplication.context;
}

}

现在像这样修改你的displayImage:

public void displayMyImage () {
if (chatHead == null) {
    chatHead = new ImageView(MyApplication.getAppContext());// NPE won't occur
......
}
}