onHandleIntent - 关闭应用程序时墙纸更改无法正常工作
onHandleIntent - Wallpaper change not working correctly when app is closed
我正在使用 IntentService 在后台更改墙纸。它在收到推送通知时被调用。如果在应用程序打开时收到通知,下面的代码可以正常工作。但如果应用程序是 closed/killed(通过在菜单按钮的帮助下将其滑开)
,则不起作用
@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);
}
打开应用程序时工作正常。当 closed/killed 时,它无法创建 WallpaperManager 实例并抛出以下异常。
W/System.err: java.lang.NullPointerException
W/System.err: at android.app.WallpaperManager.getInstance(WallpaperManager.java:361)
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" />
当一个应用程序从最近任务列表中滑出时,该应用程序的进程将被终止并回收其内存。所有应用程序组件(活动、服务、提供程序、单例等)都不再存在。
根据您描述的情况,应用被刷卡杀进程后,收到推送通知。这似乎由启动您的服务的 WakefulBroadcastReceiver
处理。那时,该服务是您应用程序中唯一的活动组件。不存在 MainActivity 的实例。除非您有未在此处发布的执行其他应用程序初始化的代码,否则 MySingletonClass 为 null and/or mainActivityInstance 为 null。
而不是使用 @qbix 指出的实际上为空的 MySingletonClass.mainActivityInstance
,而是使用 this
.
的 IntentService 上下文
try {
WallpaperManager myWallpaperManager = WallpaperManager
.getInstance(this);
url = new URL(
imageUrl);
Bitmap bmp = BitmapFactory.decodeStream(url
.openConnection().getInputStream());
myWallpaperManager.setBitmap(bmp);
}
我正在使用 IntentService 在后台更改墙纸。它在收到推送通知时被调用。如果在应用程序打开时收到通知,下面的代码可以正常工作。但如果应用程序是 closed/killed(通过在菜单按钮的帮助下将其滑开)
,则不起作用@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);
}
打开应用程序时工作正常。当 closed/killed 时,它无法创建 WallpaperManager 实例并抛出以下异常。
W/System.err: java.lang.NullPointerException
W/System.err: at android.app.WallpaperManager.getInstance(WallpaperManager.java:361)
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" />
当一个应用程序从最近任务列表中滑出时,该应用程序的进程将被终止并回收其内存。所有应用程序组件(活动、服务、提供程序、单例等)都不再存在。
根据您描述的情况,应用被刷卡杀进程后,收到推送通知。这似乎由启动您的服务的 WakefulBroadcastReceiver
处理。那时,该服务是您应用程序中唯一的活动组件。不存在 MainActivity 的实例。除非您有未在此处发布的执行其他应用程序初始化的代码,否则 MySingletonClass 为 null and/or mainActivityInstance 为 null。
而不是使用 @qbix 指出的实际上为空的 MySingletonClass.mainActivityInstance
,而是使用 this
.
try {
WallpaperManager myWallpaperManager = WallpaperManager
.getInstance(this);
url = new URL(
imageUrl);
Bitmap bmp = BitmapFactory.decodeStream(url
.openConnection().getInputStream());
myWallpaperManager.setBitmap(bmp);
}