Android:如何覆盖拨号器的默认行为

时间:2013-04-24 05:17:06

标签: android android-keypad

我正在以前的项目中进行修改,该项目基本上是为儿童和青少年开发的。当用户以高于16 MPH的速度行驶时,它会阻止text messaging, emails, calls and internet。该服务通过SMS激活。由于应用不适用于Android v4.1及更高版本,因此需要修改。我在PlayStore上看到了一个名为Safely Go的应用。这个应用程序点击一个按钮,状态更改为驾驶。在此模式下,如果用户单击拨号程序,消息传递,设置或浏览器,则会打开自己的活动,而不是默认行为。简而言之,在这种模式下,用户无法访问除用户在驾驶期间选择使用的那些应用程序之外的任何内容。

根据我的要求,该服务将通过SMS激活。一旦服务被激活,并且用户的速度超过16英里/小时,我希望当用户点击Dialer时,我的活动应该打开,这将显示警告消息,而不是打开拨号盘。 我没有得到如何完成此功能。由于服务没有与用户直接交互,因此android系统无法捕获服务中的关键事件。或者,还有其他方法可以做到这一点。

我只是想知道如何覆盖默认行为拨号程序。如果有人有任何信息请分享,因为这对我有很大的帮助。

1 个答案:

答案 0 :(得分:0)

在我在我的问题中提到的应用程序中,没有覆盖默认行为。这是我的错误,我采取了错误的方式。使用Handler可以实现相同的功能。在我的应用程序中,我使用service,点击按钮即可启动。在服务内部,我曾经使用过处理程序。下面,我发布了代码段。

public class DialerService extends Service {
ActivityManager am;
List<RunningAppProcessInfo> mAppProcessInfosList;
private Runnable myRunnable;
boolean threadDone = true;
Handler mHandler;
boolean isLockedAppRunning = false;

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

public void onCreate() {
    am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    mAppProcessInfosList = new ArrayList<ActivityManager.RunningAppProcessInfo>();
    mHandler = new Handler();
    Log.v("Dialer Service", "onCreate called");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    myRunnable = new Runnable() {

        @Override
        public void run() {
            isRestrictedAppRunning();
        }
    };

    new Thread(new Runnable() {
        public void run() {
            while (threadDone) {

                try {
                    mHandler.post(myRunnable);
                } catch (Exception e) {

                }
            }
        }
    }).start();
    return START_STICKY;
}

private void isRestrictedAppRunning() {
    mAppProcessInfosList = am.getRunningAppProcesses();
    for (int i = 0; i < mAppProcessInfosList.size(); i++) {
        if (mAppProcessInfosList.get(i).processName
                .equals("com.android.phone")
                || mAppProcessInfosList.get(i).processName
                        .equals("com.android.email")
                || mAppProcessInfosList.get(i).processName
                        .equals("com.android.mms")) {
            isLockedAppRunning = true;
            Intent dialogIntent = new Intent(getBaseContext(),
                    TestActivity.class);
            dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getApplication().startActivity(dialogIntent);
        }
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    this.threadDone = false;
}
}

此代码来自我的虚拟应用程序。在实际的应用程序中有很多条件,仍然需要实现很多东西。但是,我真正需要的是以这种方式工作。