2013-04-24 29 views
1

我在之前的項目中進行了修改,該項目基本上是爲兒童和青少年開發的。當用戶以大於16 MPH的速度駕駛時,它會阻止text messaging, emails, calls and internet。該服務通過SMS激活。由於該應用不適用於Android v4.1及以上版本,因此需要修改。我在PlayStore上看到一個名爲Safely Go的應用程序。這個應用程序有一個按鈕,點擊它,狀態改變駕駛。在這種模式下,如果用戶點擊撥號程序,消息傳遞,設置或瀏覽器,他們自己的活動就會打開,而不是默認行爲。簡而言之,在這種模式下,用戶不能訪問除駕駛期間用戶選擇使用的應用程序之外的任何其他應用程序。Android:如何覆蓋撥號器的默認行爲

根據我的要求,服務將通過SMS激活。一旦服務被激活,並且用戶的速度達到16MPH以上,我希望當用戶點擊Dialer時,我的活動應該打開,它將顯示一條警告消息,而不是打開撥號盤。 我沒有得到如何完成此功能。由於服務與用戶沒有直接的交互,所以android系統無法捕獲服務中的關鍵事件。或者,還有其他方法可以做到這一點。

我只是想知道如何覆蓋默認行爲撥號程序。如果有人有任何信息請分享,因爲這對我很有幫助。

回答

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; 
} 
} 

此代碼來自我的虛擬應用程序。實際應用中有很多條件,還有很多事情需要實施。但是,我所需要的實際上會以這種方式工作。