0

我正在使用 IntentService 在后台更改墙纸。它在收到推送通知时被调用。如果在应用程序打开时收到通知,下面的代码可以正常工作。但是如果应用程序被关闭/杀死(通过在菜单按钮的帮助下将其刷掉)则不起作用

@Override
protected void onHandleIntent(Intent intent) {

    //Toast.makeText(this, "Intent", Toast.LENGTH_SHORT).show();
    sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

    String imageUrl = intent.getExtras().getString("imageUrl");

    try {
        URL url;
        try {
            WallpaperManager myWallpaperManager = WallpaperManager
                    .getInstance(MySingletonClass.mainActivityInstance);


            url = new URL(
                    imageUrl);
            Bitmap bmp = BitmapFactory.decodeStream(url
                    .openConnection().getInputStream());
            myWallpaperManager.setBitmap(bmp);


        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    PushReceiver.completeWakefulIntent(intent);
}

打开应用程序时工作正常。当关闭/杀死时,它无法创建 WallpaperManager 的实例并抛出异常。

W/System.err: java.lang.NullPointerException
W/System.err: at android.app.WallpaperManager.getInstance(WallpaperManager.java:361)
4

3 回答 3

1

当应用程序从最近任务列表中滑出时,该应用程序的进程将被终止并回收其内存。所有应用程序组件(活动、服务、提供程序、单例等)都不再存在。

在您描述的情况下,在应用程序被刷卡并终止其进程后,会收到推送通知。这似乎由WakefulBroadcastReceiver启动您的服务的 a 处理。此时,服务是您应用程序中唯一的活动组件。不存在 MainActivity 的实例。除非您有未在此处发布的执行其他应用程序初始化的代码,否则 MySingletonClass 为 null 和/或 mainActivityInstance 为 null。

于 2015-12-30T23:20:56.037 回答
0

而不是使用MySingletonClass.mainActivityInstance@qbix 所指出的实际为 null,而是使用 IntentService 的上下文 which is this

try {
        WallpaperManager myWallpaperManager = WallpaperManager
                .getInstance(this);


        url = new URL(
                imageUrl);
        Bitmap bmp = BitmapFactory.decodeStream(url
                .openConnection().getInputStream());
        myWallpaperManager.setBitmap(bmp);


    }
于 2016-01-19T17:18:05.807 回答
0
public class MyReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that MyIntentService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                MyIntentService.class.getName());
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
    }
}

public class MyIntentService extends IntentService {

    public GcmIntentService() {
        super("MyIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
      // do some stuff
    }
  }

清单代码:

   <receiver android:name=".receiver.MyBroadcastReceiver" >
     <intent-filter>
     </intent-filter>
   </receiver>

  <service android:name=".receiver.MyIntentService" />
于 2015-12-30T22:02:27.583 回答