极光推送保活

极光推送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

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值