android – 活动d出来电屏幕

android – 活动d出来电屏幕,第1张

概述我试图覆盖来电屏幕 – 我知道我无法改变它所以我试图d出一个活动ontop. 我的代码工作正常,除非手机闲置几分钟. 我的代码: AndroidManifest.xml: <?xml version="1.0" encoding="utf-8" ?><manifest xmlns:android="http://schemas.android.com/apk/res/android" 我试图覆盖来电屏幕 – 我知道我无法改变它所以我试图d出一个活动ontop.

我的代码工作正常,除非手机闲置几分钟.

我的代码:

AndroidManifest.xml:

<?xml version="1.0" enCoding="utf-8" ?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID"      package="com.example.myfirstapp"      androID:versionCode="7"      androID:versionname="7">    <uses-sdk androID:minSdkVersion="7" androID:targetSdkVersion="10"></uses-sdk>    <uses-permission androID:name="androID.permission.READ_PHONE_STATE"/>    <uses-permission androID:name="androID.permission.MODIFY_PHONE_STATE"/>    <uses-permission androID:name="androID.permission.CALL_PHONE" />    <application androID:label="@string/app_name" androID:icon="@drawable/ic_launcher">        <receiver androID:name=".MyPhonebroadcastReceiver" androID:enabled="true">            <intent-filter androID:priority="99999">                <action androID:name="androID.intent.action.PHONE_STATE" />            </intent-filter>        </receiver>        <activity            androID:name=".Call" >        </activity>    </application></manifest>

MyPhonebroadcastReceiver.java:

public class MyPhonebroadcastReceiver extends broadcastReceiver{    public voID onReceive(final Context context,Intent intent) {        Thread pageTimer = new Thread(){            public voID run(){                try{                    sleep(700);                } catch (InterruptedException e){                    e.printstacktrace();                } finally {                    Intent i = new Intent();                    i.setClass(context,Call.class);                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_top);                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                    i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);                      i.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);                    i.putExtra("INCOMING_NUMBER",incomingNumber);                    i.setAction(Intent.ACTION_MAIN);                    i.addcategory(Intent.category_LAUNCHER);                    context.startActivity(i);                }            }        };        pageTimer.start();    }}

Call.java:

package com.example.myfirstapp;import androID.app.Activity;import androID.os.Bundle;public class Call extends Activity{    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        getwindow(). addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);        getwindow().addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);        getwindow().addFlags(Intent.FLAG_ACTIVITY_CLEAR_top);        setContentVIEw(R.layout.main);    }}

顺便说一句 – 我试着等待屏幕在睡眠前醒来(700)并没有帮助
(在MyPhonebroadcastReceiver.java中)

...try {          if (pm.isScreenOn()) {        sleep(700);    } else {        while (!pm.isScreenOn()) {            // Do nothing...        }        sleep(700);    }}...
解决方法 当手机屏幕关闭且有来电时,还有更多工作要做(醒来,处理键盘保护视图……)因此,通话中活动需要更长时间才能显示,这导致了呼叫活动的开始时间早于通话中活动的开始 – >通话活动位于最前面
没有确切的时间需要显示通话中活动(您已经尝试过并看到700毫秒是不够的)
我的解决方案:继续跟踪Call活动的状态:

>如果它仍然在顶部并且用户没有解雇它(或任何条件
解雇),只需使用处理程序进行跟踪
>如果有任何其他活动转到前台,则调用活动
试着回到顶部

我的样本活动:

public class MainActivity extends Activity {    private ActivityManager mActivityManager;    private boolean mdismissed = false;    private static final int MSG_ID_CHECK_top_ACTIVITY = 1;    private static final long DELAY_INTERVAL = 100;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        Window window = getwindow();        window.addFlags(WindowManager.LayoutParams.FLAG_disMISS_KEyguard);        mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);        mHandler.sendEmptyMessageDelayed(MSG_ID_CHECK_top_ACTIVITY,DELAY_INTERVAL);    }    private Handler mHandler = new Handler() {        public voID handleMessage(androID.os.Message msg) {            if (msg.what == MSG_ID_CHECK_top_ACTIVITY && !mdismissed) {                List<RunningTaskInfo> tasks = mActivityManager                        .getRunningTasks(1);                String topActivityname = tasks.get(0).topActivity                        .getClassname();                if (!topActivityname.equals(MainActivity.this                        .getComponentname().getClassname())) {                    // Try to show on top until user dismiss this activity                    Intent i = new Intent();                    i.setClass(MainActivity.this,MainActivity.class);                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_top);                    i.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);                    startActivity(i);                }                sendEmptyMessageDelayed(MSG_ID_CHECK_top_ACTIVITY,DELAY_INTERVAL);            }        };    };}
总结

以上是内存溢出为你收集整理的android – 活动d出来电屏幕全部内容,希望文章能够帮你解决android – 活动d出来电屏幕所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1130295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存