0

我正在開發一個Android應用程序,我希望在來電時顯示一個敬酒,當屏幕解鎖時,我的應用程序運行良好。但是,主屏幕鎖定時不顯示任何東西,任何人都可以幫助我。Android:屏幕鎖定時如何運行服務?

這裏是我的整個代碼

package com.example.lenovo.call_toast; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 


public class MainActivity_service extends Activity { 

    private boolean detectEnabled; 

    private TextView textViewDetectState; 
    private Button buttonToggleDetect; 
    private Button buttonExit; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     PowerManager mgr = (PowerManager)getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 
     wakeLock.acquire(); 

     textViewDetectState = (TextView) findViewById(R.id.textViewDetectState); 

     buttonToggleDetect = (Button) findViewById(R.id.buttonDetectToggle); 
     buttonToggleDetect.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       setDetectEnabled(!detectEnabled); 
      } 
     }); 

     buttonExit = (Button) findViewById(R.id.buttonExit); 
     buttonExit.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       setDetectEnabled(false); 
       MainActivity_service.this.finish(); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    private void setDetectEnabled(boolean enable) { 
     detectEnabled = enable; 

     Intent intent = new Intent(this, CallDetectService.class); 
     if (enable) { 
      // start detect service 




      startService(intent); 

      buttonToggleDetect.setText("Turn off"); 
      textViewDetectState.setText("Detecting"); 
     } 
     else { 
      // stop detect service 
      stopService(intent); 

      buttonToggleDetect.setText("Turn on"); 
      textViewDetectState.setText("Not detecting"); 
     } 
    } 

} 

這是我的服務來檢測呼叫

package com.example.lenovo.call_toast; 

    import android.app.Service; 
    import android.content.Intent; 
    import android.os.IBinder; 


    public class CallDetectService extends Service { 
     private CallHelper callHelper; 

     public CallDetectService() { 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      callHelper = new CallHelper(this); 

      int res = super.onStartCommand(intent, flags, startId); 
      callHelper.start(); 
      return res; 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 

      callHelper.stop(); 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      // not supporting binding 
      return null; 
     } 
    } 

這是另一個類

package com.example.lenovo.call_toast; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.widget.Toast; 


public class CallHelper { 

    /** 
    * Listener to detect incoming calls. 
    */ 
    private class CallStateListener extends PhoneStateListener { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 

      switch (state) { 
      case TelephonyManager.CALL_STATE_RINGING: 
       // called when someone is ringing to this phone 

       Toast.makeText(ctx, 
         "Incoming: " +incomingNumber, 
         Toast.LENGTH_LONG).show(); 

       break; 

      } 
     } 
    } 

    /** 
    * Broadcast receiver to detect the outgoing calls. 
    */ 
    public class OutgoingReceiver extends BroadcastReceiver { 
     public OutgoingReceiver() { 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
      Log.e("onCallStateChanged: ",number); 
      Toast.makeText(ctx,"Outgoing: "+number, 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

    private Context ctx; 
    private TelephonyManager tm; 
    private CallStateListener callStateListener; 

    private OutgoingReceiver outgoingReceiver; 

    public CallHelper(Context ctx) { 
     this.ctx = ctx; 

     callStateListener = new CallStateListener(); 
     outgoingReceiver = new OutgoingReceiver(); 
    } 

    /** 
    * Start calls detection. 
    */ 
    public void start() { 
     tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); 
     tm.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE); 

     IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL); 
     ctx.registerReceiver(outgoingReceiver, intentFilter); 

    } 

    /** 
    * Stop calls detection. 
    */ 
    public void stop() { 
     tm.listen(callStateListener, PhoneStateListener.LISTEN_NONE); 
     ctx.unregisterReceiver(outgoingReceiver); 
    } 

} 

這裏是清單文件

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.lenovo.call_toast"> 

    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK"/> 



    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity_service"> 
      <intent-filter>--> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <!--<activity android:name=".MyCustomDialog"--> 
      <!--android:theme="@android:style/Theme.Dialog"--> 
      <!--android:noHistory="true"--> 
      <!--/>--> 
     <!--&lt;!&ndash;<receiver android:name=".CallReceiver" >&ndash;&gt;--> 
      <!--&lt;!&ndash;<intent-filter>&ndash;&gt;--> 
       <!--&lt;!&ndash;<action android:name="android.intent.action.PHONE_STATE" />&ndash;&gt;--> 
      <!--&lt;!&ndash;</intent-filter>&ndash;&gt;--> 
      <!--&lt;!&ndash;<intent-filter>&ndash;&gt;--> 
       <!--&lt;!&ndash;<action android:name="android.intent.action.NEW_OUTGOING_CALL" />&ndash;&gt;--> 
      <!--&lt;!&ndash;</intent-filter>&ndash;&gt;--> 
     <!--</receiver>--> 

     <service android:name=".CallDetectService" 

      android:enabled="true" 
      android:exported="false"/> 

    </application> 


</manifest> 

回答

0

當屏幕鎖定時,您編寫的代碼將無法用於新設備,因爲現在android需要處理電池消耗。所以它不會允許後臺服務與接收器一起運行。但儘管如此,如果你想這樣做,請按照下列步驟操作:

  • 步驟1)使接收器
  • 步驟2)啓動服務/活動或上的onReceive方法 任何任務,而不是連續運行它作爲接收器是爲了完成這項任務。

喜歡:

@Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 
    { 

    Bundle bb = intent.getExtras(); 
      String state = bb.getString(TelephonyManager.EXTRA_STATE); 
      if ((state != null)&& (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)))  
      { 
       incommingNumber = bb.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
    blockCall(context, bb); 
    } 
    } 

    public void blockCall(Context c, Bundle b) 
    { 

     TelephonyManager telephony = (TelephonyManager) 
     c.getSystemService(Context.TELEPHONY_SERVICE); 
     try { 
     Class cls = Class.forName(telephony.getClass().getName()); 
     Method m = cls.getDeclaredMethod("getITelephony"); 
     m.setAccessible(true); 
     telephonyService = (ITelephony) m.invoke(telephony); 
     //telephonyService.silenceRinger(); 
     telephonyService.endCall(); 

      new SendValue(c,incommingNumber); 

     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
} 

凡SendValue(上下文C,字符串incomingNumber);是其他Java類的構造函數,用於在接收到調用時執行必要的任務,並且incommingNumber是全局String變量,以便在接收到調用時可以更改其值。

+0

這裏有一個很好的鏈接,將有助於http://stackoverflow.com/questions/9029040/how-to-run-an-android-app-in-background/43555050#43555050 – user2288580