2

我很努力使我的基本鎖屏app.starting,該應用程序顯示一個基本的活動屏幕,圖像視圖(顯示存儲的圖像)和一個TextView(顯示日期爲&時間)。在向上滑動時,活動返回。我正在努力的是,當屏幕關閉&打開時,事件接收器應發送此事件&我的活動應該再次到達前臺。這不是發生了什麼事。 我不完全確定如何使用我的服務& broadcastreceiver來實現這一點。任何幫助,將不勝感激請。試圖做一個簡單的鎖屏應用程序工作,努力與服務和收件人

我AndroidManifest文件:

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

<uses-sdk 
    android:minSdkVersion="11" 
    android:targetSdkVersion="19" /> 

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

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppCompat.Light.NoActionBar" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 

    <receiver 
     android:name="com.example.kjtest2.EventsReciever" 
     android:enabled="true" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="android.intent.action.SCREEN_OFF"/> 
      <action android:name="android.intent.action.SCREEN_ON"/> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     </intent-filter> 
    </receiver>  

    <service 
     android:enabled="true" 
     android:name="com.example.kjtest2.myService"/>   

    <activity 
     android:name="com.example.kjtest2.MainActivity" 
     android:label="@string/app_name" 
     > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="android.intent.category.HOME" /> 
      <category android:name="android.intent.category.DEFAULT" />     
     </intent-filter> 
    </activity> 
</application> 

我的接收機

 import android.content.BroadcastReceiver; 
     import android.content.Context; 
     import android.content.Intent; 
     import android.util.Log; 

    public class EventsReciever extends BroadcastReceiver { 

    public boolean wasScreenOn = true; 
    @Override 
    public void onReceive(Context context, Intent recievedIntent) { 

     Log.i("Check","[BroadCastReciever] onRecieve()"); 

     if (recievedIntent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      wasScreenOn = false; 
      Log.i("Check","[BroadCastReciever] Screen went OFF"); 
     } else if (recievedIntent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      wasScreenOn = true; 
      Log.i("Check","[BroadCastReciever] Screen went ON"); 

      Intent intent = new Intent(context, MainActivity.class); 
      context.startActivity(intent); 
     } 
     else if(recievedIntent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 
     { 
      Intent intent = new Intent(context, MainActivity.class); 
      context.startActivity(intent); 
     } 
    } 

} 

我的onCreate代碼的活動:

protected void onCreate(Bundle savedInstanceState) { 
    Log.i("event", "activity onCreate"); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 

    Intent intent = new Intent(this, EventsReciever.class); 
    setContentView(R.layout.activity_main); 

    /** REMOVING KEYGUARD RECEIVER **/ 
    KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE); 
    KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE); 
    lock.disableKeyguard();  
    setTime(); 
    changeImage(); 
    ImageView img2 = (ImageView)findViewById(R.id.imageView); 
    img2.setOnTouchListener(new OnSwipeTouchListener(this) { 
     @Override 
     public void onSwipeLeft() { 
      Toast.makeText(MainActivity.this, "Swipe left", Toast.LENGTH_SHORT) 
       .show(); 
      changeImage(); 
      Log.i("event","onSwipeLeft"); 
     } 
     @Override 
     public void onSwipeRight() { 
      TextView tvDisplayDate = (TextView)findViewById(R.id.date1); 
      CustomDigitalClock cdc = (CustomDigitalClock)findViewById(R.id.dc1); 
      if (tvDisplayDate.getVisibility()==View.VISIBLE) { 
       tvDisplayDate.setVisibility(View.GONE); 
       cdc.setVisibility(View.GONE); 
      } else { 
       tvDisplayDate.setVisibility(View.VISIBLE); 
       cdc.setVisibility(View.VISIBLE); 
      } 
     } 
     @Override   
     public void onSwipeUp() { 
      Toast.makeText(MainActivity.this, "Swipe up", Toast.LENGTH_SHORT) 
       .show(); 
      MainActivity.this.moveTaskToBack(true); 
     } 
     @Override   
     public void onSwipeDown() { 
      Toast.makeText(MainActivity.this, "Swipe down", Toast.LENGTH_SHORT) 
       .show(); 
     } 
    }); 
} 

最後我的服務:

public class myService extends Service{ 
private NotificationManager mNM; 
private int NOTIFICATION = R.string.local_service_started; 
private final IBinder mBinder = new MyBinder(); 
private Messenger outMessenger; 

@Override 
public void onCreate() { 

    /** INITIALIZE RECEIVER **/ 
    //RegisterReciever(); 
    Log.i("event", "ServiceStarted"); 
    mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 

    // Display a notification about us starting. We put an icon in the status bar. 
    showNotification(); 
} 
} 

截至目前,接收器&服務沒有啓動。我已經能夠通過動態註冊事件來啓動它們,但我不認爲這是必需的。在清單中註冊事件應該足以滿足我的申請,不是嗎?

感謝您的幫助。

回答

1

確保您的服務是通過在您的活動onCreate()

它實際上是需要以編程方式登記接收startService(new Intent(this,MyService.class));聲明運行,艙單申報將不會爲Intent.ACTION_SCREEN_OFFIntent.ACTION_SCREEN_ON工作,在服務onCreate()註冊接收器的實例,註銷在onDestroy()

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
filter.addAction(Intent.ACTION_SCREEN_OFF); 
receiver = new EventsReciever(); 
registerReceiver(receiver, filter); 
+0

對不起,爲什麼 「艙單申報將不Intent.ACTION_SCREEN_OFF和Intent.ACTION_SCREEN_ON工作」。謝謝 :) – kemdo

相關問題