极光推送app退到后台或息屏后,收不到推送消息,在网上查资料,在不自动清理的情况下,可以一直受到消息,就是费电。
资料来源于
https://blog.csdn.net/wusj3/article/details/83269293
https://www.cnblogs.com/blosaa/p/9510225.html
首先,需要一个不被杀死的后台服务PlayerMusicService,服务挂掉后需要自启动,需要区分android8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent);
} else {
startService(intent);
}
以下是PlayerMusicService代码
public class PlayerMusicService extends Service {
private final static String TAG = "PlayerMusicService";
private MediaPlayer mMediaPlayer;
private ScreenStatusReceiver mScreenStatusReceiver;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, TAG + "---->onCreate,启动服务");
initReceiver();
mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.no_notice);
mMediaPlayer.setLooping(true);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//播放无声音乐
startPlayMusic();
}
}).start();
return START_STICKY;
}
private void initReceiver() {
//注册息屏,开屏广播
mScreenStatusReceiver = new ScreenStatusReceiver();
IntentFilter screenStatus = new IntentFilter(Intent.ACTION_SCREEN_ON);
screenStatus.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStatusReceiver, screenStatus);
}
private void startPlayMusic() {
if (mMediaPlayer != null) {
Log.d(TAG, "启动后台播放音乐");
mMediaPlayer.start();
}
}
private void stopPlayMusic() {
if (mMediaPlayer != null) {
Log.d(TAG, "关闭后台播放音乐");
mMediaPlayer.stop();
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onDestroy() {
super.onDestroy();
stopPlayMusic();
if (mScreenStatusReceiver!=null){
unregisterReceiver(mScreenStatusReceiver);
}
Log.d(TAG, TAG + "---->onCreate,停止服务");
// 重启
// 启动服务的地方
Intent intent = new Intent(getApplicationContext(), PlayerMusicService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent);
} else {
startService(intent);
}
}
}
<service
android:name=".service.PlayerMusicService"
android:enabled="true"
android:exported="true" />
接着写监听开屏息屏的广播ScreenStatusReceiver
public class ScreenStatusReceiver extends BroadcastReceiver {
private final static String TAG = "PlayerMusicService";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(Intent.ACTION_SCREEN_OFF)){
// 当屏幕关闭时,启动一个像素的Activity
Log.d(TAG, "onReceive: 当屏幕关闭时,启动一个像素的Activity");
Intent activity = new Intent(context,OnePxActivity.class);
activity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(activity);
} else if (action.equals(Intent.ACTION_SCREEN_ON)){
// 用户解锁,关闭Activity
// 这里发个广播是什么鬼,其实看下面OnePxAcitivity里面的代码就知道了,发这个广播就是为了finish掉OnePxActivity
Log.d(TAG, "onReceive: 用户解锁,关闭Activity");
Intent broadcast = new Intent("FinishActivity");
// broadcast.setFlags(32);Intent.FLAG_INCLUDE_STOPPED_PACKAGES
context.sendBroadcast(broadcast);//发送对应的广播
}
}
}
打开1像素页面
public class OnePxActivity extends Activity {
private static final String TAG="PlayerMusicService";
protected BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 收到广播
Log.d(TAG, "onReceive: 收到广播,关闭Activity");
OnePxActivity.this.finish();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: 开启一像素页面");
Window window = getWindow();
// 设置窗口位置在左上角
window.setGravity(Gravity.LEFT | Gravity.TOP);
WindowManager.LayoutParams params = window.getAttributes();
params.x = 0;
params.y = 0;
params.width = 1;
params.height = 1;
window.setAttributes(params);
// 动态注册广播,这个广播是在屏幕亮的时候,发送广播,来关闭当前的Activity
registerReceiver(receiver, new IntentFilter("FinishActivity"));
}
@Override
protected void onDestroy() {
unregisterReceiver(receiver);
Log.e(TAG, "onDestory");
super.onDestroy();
}
}
OnePxActivity 在manifest文件中的配置
<activity
android:name=".ui.OnePxActivity"
android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
android:excludeFromRecents="true"
android:exported="false"
android:finishOnTaskLaunch="false"
android:launchMode="singleInstance"
android:process=":process"
android:theme="@style/undeadActivityStyle"></activity>
style中配置theme
<!--//一像素activity-->
<style name="undeadActivityStyle">
<!--背景设置为透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!--是否有边框 -->
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<!--是否浮动在界面上 -->
<item name="android:windowIsFloating">true</item>
<!--是否透明 -->
<item name="android:windowIsTranslucent">true</item>
<!--窗体上面是否有遮盖 -->
<item name="android:windowContentOverlay">@null</item>
<!-- 背景是否变暗 -->
<item name="android:backgroundDimEnabled">false</item>
<!-- 设置背景透明 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 为窗体的Enter和Exit设置动画 -->
<item name="android:windowAnimationStyle">@null</item>
<!-- 是否禁止窗体显示前显示的View -->
<item name="android:windowDisablePreview">true</item>
<item name="android:windowNoDisplay">false</item>
</style>
无声音乐下载地址
谢好人留https://pan.baidu.com/s/1smPKs5f