ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android Nougat上Lockscreen中的URI的startActivity

2019-06-08 14:11:15  阅读:253  来源: 互联网

标签:android android-activity android-intent android-alarms android-broadcast


我正在使用从AlarmManager接收广播的BroadcastReceiver.在接收器中,我开始了两项活动.一个活动是从这样的URI开始的,是第三方应用程序:

// Open spotify
Intent spotify = new Intent(Intent.ACTION_VIEW, Uri.parse(song));
spotify.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

try {
    context.startActivity(spotify);
} catch (ActivityNotFoundException e) {
    status = Status.SPOTIFY_NOT_INSTALLED;
}

之后,我再次使用AlarmManager启动另一个属于应用程序的活动,延迟时间为5秒:

public static void setExact(
        Context context, PendingIntent pendingIntent, long time
) {

    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        am.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
    else
        am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);

}

public static void setExactDelay(
        Context context, PendingIntent pendingIntent, long delay
) {
    setExact(context, pendingIntent, System.currentTimeMillis() + delay);
}

    PendingIntent pendingIntent = AlarmPlayActivity.makePendingIntent(context, alarm, status, startTime);
    AlarmSet.setExactDelay(context, pendingIntent, 5000);

第二项活动按预期在5秒内开始.但是,第一个活动仅在设备解锁时启动.如果设备已锁定,则无法在Android Nougat(7.0)上启动.即使锁没有通过密码,模式等保护,也是如此.这种方法适用于早期的Android版本,即使是安全锁定也是如此.

有没有一种方法可以在不需要屏幕的情况下启动第一个活动?

编辑:我尝试使用以下IntentService.它在设备处于唤醒和解锁状态时有效,但在设备锁定时没有运气:

public class AlarmService extends IntentService {

    static final int NOTIFICATION_ID = 1;

    public AlarmService() {
        super("AlarmService");
    }

    public static Intent makeIntent(Context context, Alarm alarm, AlarmReceiver.Status status, long startTime) {

        Intent intent = IntentFactory.alarmPlayIntent(alarm, status, startTime);
        intent.setClass(context, AlarmService.class);

        return intent;

    }

    private static void sleep(long time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            // Nothing
        }
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        // Acquire Wakelock immediately

        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

        PowerManager.WakeLock wakeLock = pm.newWakeLock(
                PowerManager.FULL_WAKE_LOCK |
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                PowerManager.ON_AFTER_RELEASE,
                "AlarmServiceWakeLock"
        );

        wakeLock.acquire();

        KeyguardManager.KeyguardLock lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
        lock.disableKeyguard();

        // Get intent data

        final Alarm alarm = IntentFactory.getAlarm(intent);
        AlarmReceiver.Status status = IntentFactory.getStatus(intent);
        final long startTime = IntentFactory.getStartTime(intent, 0);

        // Get a random song for this alarm

        AlarmDatabase db = AlarmDatabase.getInstance(this);
        Song song = db.getRandomSong(alarm);

        String songName = song == null ? "backup sound" : song.getName();

        // Start a foreground notification

        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle(getText(R.string.alarm_starting_notification_title))
                .setContentText(getString(
                        R.string.alarm_starting_notification_message, alarm.getName(), songName
                ))
                .setSmallIcon(R.drawable.ic_launcher)
                .setPriority(NotificationCompat.PRIORITY_MAX)
                .build();

        startForeground(NOTIFICATION_ID, notification);

        // Potentially open Spotify if we can

        if (song != null) {

            // Open spotify

            Intent spotify = new Intent(Intent.ACTION_VIEW, Uri.parse(song.getUri()));
            spotify.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

            try {
                startActivity(spotify);
            } catch (ActivityNotFoundException e) {
                status = AlarmReceiver.Status.SPOTIFY_NOT_INSTALLED;
            }

        } else
            status = AlarmReceiver.Status.NO_SONGS;

        // Start play activity in 10 seconds, giving Spotify some chance to load up.

        sleep(10);
        startActivity(AlarmPlayActivity.makeIntent(this, alarm, status, startTime));

        // Keep alive for 5 more seconds
        sleep(5);

        // Stop notification
        stopForeground(true);

        // Release wakelock
        wakeLock.release();


    }

}

解决方法:

我遇到了同样的问题,我认为Intent.ACTION_VIEW在您出于安全原因解锁屏幕之前不起作用.

同样的问题也讨论了here.您也可以查看此link

标签:android,android-activity,android-intent,android-alarms,android-broadcast
来源: https://codeday.me/bug/20190608/1198315.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有