Во-первых, вы можете попытаться сделать приложение Widget неопытным.
Сам виджет не будет убит.Изначально виджет был трансляционным, и он статический.Это означает, что подписанный широковещательный виджет может быть получен в любое время, и будет вызван метод onReceive (). Причина, по которой виджеты не могут быть запущены, заключается в том, что они должны быть уничтожены для соответствующей службы. Если вы хотите, чтобы виджет работал постоянно, служба должна быть убита и перезапущена.
Сервис является компонентом системы Android, он аналогичен уровню Активности, но он не может работать самостоятельно, может работать только в фоновом режиме и может взаимодействовать с другими компонентами.В процессе разработки Android каждый раз, когда вызывается startService (Intent), вызывается метод OnStartCommand (Intent, int, int) объекта Service, а затем некоторая обработка выполняется в методе onStartCommand.
1. Создайте сервид, чтобы не быть убитым
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
return START_STICKY_COMPATIBILITY;
//return super.onStartCommand(intent, flags, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
flags = START_STICKY;
return super.onStartCommand(intent, flags, startId);
// return START_REDELIVER_INTENT;
}
@Override
public void onStart(Intent intent, int startId)
{
// again regsiter broadcast
IntentFilter localIntentFilter = new IntentFilter("android.intent.action.USER_PRESENT");
localIntentFilter.setPriority(Integer.MAX_VALUE);// max int
myReceiver searchReceiver = new myReceiver();
registerReceiver(searchReceiver, localIntentFilter);
super.onStart(intent, startId);
}
2, Перезапустите службу в onDestroy () службы.
public void onDestroy()
{
Intent localIntent = new Intent();
localIntent.setClass(this, MyService.class); // restart Service
this.startService(localIntent);
}
3, создайте трансляцию и регистр в XML
public class myReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
context.startService(new Intent(context, Google.class));
}
}
<receiver android:name=".myReceiver" >
<intent-filter android:priority="2147483647" ><!--Priority plus highest-->
<!-- when applicayion lauch invoke -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
<!-- unlock invole -->
<action android:name="android.intent.action.USER_PRESENT" />
<!--context switch -->
<action android:name="android.media.RINGER_MODE_CHANGED" />
</intent-filter>
</receiver>
<service android:name=".MyService" >
Примечание. Для разблокировки, запуска, переключения трансляции активации сцены необходимо добавить разрешения, такие как завершение запуска и состояние мобильного телефона.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
==================================================================
Во-вторых, если приложение Widget не обладает навыками, вы можете прослушивать блокировку или разблокировку экрана.
Custom * ScreenListener и добавьте ScreenBroadcastReceiver
private class ScreenBroadcastReceiver extends BroadcastReceiver {
private String action = null;
@Override
public void onReceive(Context context, Intent intent) {
action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)) { // screen on
mScreenStateListener.onScreenOn();
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // screen off
mScreenStateListener.onScreenOff();
} else if (Intent.ACTION_USER_PRESENT.equals(action)) { // screen unlock
mScreenStateListener.onUserPresent();
}
}
}
, чтобы вы могли работать с таймерами или другими показами с клиентом.
==============================================================================
Дополнительная информация:
Этот метод не самый лучший, есть много мест, где можно улучшить, просто дать предложение.