2014-11-21 50 views
1

在我的应用程序中,我使用BroadcastReceiver来跟踪电话状态。Android:我的应用程序未使用时运行服务

TelephonyManager中有3个可用状态。

  1. EXTRA_STATE_IDLE
  2. EXTRA_STATE_OFFHOOK
  3. EXTRA_STATE_RINGING

在我的情况我想显示简单的用户界面,显示有关呼叫者的一些细节,而在电话铃声响起,我想关闭当用户或通话出席的呼叫结束时。

当手机状态为振铃时,我正在拨打我的服务。如果我的应用程序正在使用,那么当电话响起时,我可以看到我的用户界面部分。如果我的应用程序不在使用,那么我不能看到用户界面部分。

enter image description here

我在后台已经检查。该服务没有运行。我认为我的服务只在我的应用程序正在使用时运行,并且在我的应用程序未被使用时未运行。

为了克服这个我该怎么办?

这是我的代码。

@Override 
public void onReceive(Context context, Intent intent) { 
LoginActivity.login.finish(); 
MainActivity.main.finish(); 
telephonyRegister(context,intent); 
} 
public void telephonyRegister(final Context context, Intent intent) 
{ 
TelephonyManager telephony = (TelephonyManager)  context.getSystemService(Context.TELEPHONY_SERVICE); 
String imeiSIM1= telephony.getDeviceId(); 
System.out.println("IMEI NUMBER"+imeiSIM1);       
ctx=context; 
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
     TelephonyManager.EXTRA_STATE_IDLE)) { 
    try 
    { 
    ProjectDailogActivity.projdialog.finish(); 
    }catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 
else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
     TelephonyManager.EXTRA_STATE_OFFHOOK)) 
{ 
    try{ 
     ProjectDailogActivity.projdialog.finish(); 
     }catch(Exception e) 
     { 
      e.printStackTrace(); 
     }  
} 
else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
     TelephonyManager.EXTRA_STATE_RINGING)){ 
    phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
    isringing=true; 
       Intent intent11 = new Intent(ctx,ProjectDailogActivity.class); 
       intent11.putExtra("incoming_number",phoneNumber); 
       intent11.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       ctx.startActivity(intent11); 

} 

} 

的Manifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<receiver android:name="com.domyhome.broadcastreceiver.IncomingCallInterceptor" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

我喜欢truecaller窗口。

只是我提到的值是默认值。

但是当我的应用程序未被使用时,相同的窗口不会来。

请给我一个主意。

回答

0

这就是为什么Android开发者发明了BroadcastReciever - 它允许你勾你的代码作为服务响应系统事件(如启动,飞行模式等)

Vogella覆盖非常好:http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html

和您的具体情况(发送命令作为手机状态的响应),您也可以使用本文提供哪一个完全工作例如:http://androidexample.com/Incomming_Phone_Call_Broadcast_Receiver__-_Android_Example/index.php?view=article_discription&aid=61&aaid=86

文章hightlights:

<!-- Manifest.xml --> 
    <receiver android:name=".IncomingCall"> 
      <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
    </receiver> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 

,并在Java中 - 添加这些类

//your Listener class: 
    private class MyPhoneStateListener extends PhoneStateListener 
    { 
     public void onCallStateChanged(int state, String incomingNumber) 
     { 
      // state = 1 means when phone is ringing 
      if (state == 1) 
      { 
       // do something 
      } 
     } 
    } 

    //Reciever class: 
    public class IncomingCall extends BroadcastReceiver 
    { 
     public void onReceive(Context context, Intent intent) 
     { 
      // TELEPHONY MANAGER class object to register one listner 
      TelephonyManager tmgr = (TelephonyManager) context 
        .getSystemService(Context.TELEPHONY_SERVICE); 

      //Create Listner 
      MyPhoneStateListener PhoneListener = new MyPhoneStateListener(); 

      // Register listener for LISTEN_CALL_STATE 
      tmgr.listen(PhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
     } 
    } 
0

无需在接收器部分的应用程序的xml中的服务中运行它,使用电话响铃操作并在接收器中实现您的UI。并有一个不同的接收器让你的应用在手机切割时收听。

+0

其实它类似于一个truecaller应用。所以它应该始终在后台运行。当我的应用程序未被使用时,我可以看到用户界面。我也试过服务和没有服务(只是直接从响铃状态调用一个活动)。但是当我的应用程序还没有使用时,我想显示UI? – 2014-11-21 12:07:55

+0

您可以通过上述方法实现您的要求。您可以定义startactivity(intent(从您的broadcastreciever – therealprashant 2014-11-21 12:09:30

+0

请检查我的问题,我已更新 – 2014-11-21 12:17:03

0
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    Log.e("onStartCommand", "onStartCommand"); 
    return Service.START_STICKY; 
} 

http://developer.android.com/reference/android/app/Service.html

+0

谢谢迪帕克,请检查我的更新问题 – 2014-11-21 14:37:35

+0

您需要使用bindservice的概念 – deepak825 2014-11-26 09:27:21

+0

public boolean bindService(Intent service,ServiceConnection conn, int flags){返回mBase.bindService(service,conn,flags); } – deepak825 2014-11-26 09:28:18

0

使用AlarmManager到一个特定的时间后启动服务和停止服务,也可以杀死AlarmManager时打了进来。

0

尝试这样,

AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
intent.putExtra(ONE_TIME, Boolean.FALSE); 

PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi); 

,而你手动没有停止过它,它会重复......可能这可以帮助你...

相关问题