2015-10-31 3 views
0

Я хочу защитить определенные функции за паролем устройства. Поэтому, если пользователи пытаются использовать эту функцию, они снова должны подтвердить пароль.доступ к действию со стороны широковещательного приемника

Это код в классе деятельности.

Context appContext = activity.getApplicationContext(); 
RestrictionsManager rManager = (RestrictionsManager) appContext.getSystemService(appContext.RESTRICTIONS_SERVICE); 
rManager.requestPermission(RestrictionsManager.ACTION_REQUEST_PERMISSION, "someID", new PersistableBundle()); 

Это код для обработки ответа от диалога пароля подтверждения в классе PermissionResponseReceiver.

public class PermissionResponseReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, Intent intent) { 
     ...... 
    } 
} 

Есть простой способ обращения к подлинному деятельности в PermissionResponseReceiver.onReceive (...). В настоящее время мне приходится отслеживать экземпляр активности и предоставлять публичный статический метод для его получения, но это кажется очень хакированным, и я ищу альтернативу. Есть ли у вас какие-либо предложения? Благодарю.

+0

Почему вы хотите это сделать? Удержание любой информации о действии опасно, но особенно статично. Если вы объясните, чего вы пытаетесь достичь, кто-то скажет вам правильный способ сделать это. – Simon

+0

Если пароль подтвержден, я хочу, чтобы активность что-то делала. Следовательно, мне нужно иметь доступ к активности в onReceive() – hixhix

+0

Попробуйте переместить PermissionResponseReceiver как внутренний класс вашей деятельности. – kzz

ответ

1

Используйте местную трансляцию для связи между вашим PermissionResponseReceiver и вашим Activity.

В вашем PermissionResponseReceiver:

public class PermissionResponseReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, Intent intent) { 
     ...... 

    // Create the intent that will be broadcast 
    Intent intent = new Intent("my-permission-response-action"); 
    // Add any extra data you want to put in the intent here.. 

    // Broadcast to any registered receivers 
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 
    } 
} 

В вашем Activity:

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

    final LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this); 

    // IntentFilter to define which actions mLocalBroadcastReceiver will respond to 
    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction("my-permission-response-action"); 

    // Register for desired broadcasts 
    localBroadcastManager.registerReceiver(mLocalBroadcastReceiver, intentFilter); 
} 

@Override 
public void onPause() { 

    // Unregister our mLocalBroadcastReceiver 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalBroadcastReceiver); 
    super.onPause(); 
} 

/** 
* My Local Broadcast Receiver 
*/ 
private BroadcastReceiver mLocalBroadcastReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(my-permission-response-action)) { 
      // Our Activity has received the broadcast from PermissionResponseReceiver. 
      // If we added any extras to the intent we can extract them here 
      // for use in the Activity 
     } 
    } 
}; 
Смежные вопросы