2016-05-05 10 views
0

特定の時刻にMainActivityからアラームをトリガーしようとしています。私はまた、トリガーをキャッチするカスタムBroadcastReceiver(MyBroadcastReceiver)を持っています。このシナリオは正常に動作します。MainActivityインスタンスをBroadcastReceiverにPendingIntent(AlarmManager用)経由で渡す方法

MyBroadcastReceiverのMainActivityインスタンスにアクセスしたいとします。私はMainActivityの中で実装したメソッドを呼び出すためにこれが必要です。何らかの理由で、私はMainActivityインスタンスにアクセスできません。誰かが私にこれを助けることができますか?

MainActivity.java

public class MainActivity extends AppCompatActivity { 

private AlarmManager alarmMgr; 
private PendingIntent alarmPendingIntent; 
private Intent alarmIntent; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    int interval = 1000 * 2; 

    alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    alarmIntent = new Intent(this, MyBroadcastReceiver.class); 
    alarmPendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); 

    alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + interval, alarmPendingIntent); 
    } 
} 

MyBroadcastReceiver.java

public class MyBroadcastReceiver extends BroadcastReceiver { 

public SniffBTBroadcastReceiver() {} 

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    // MY CODE WORKS TILL THIS POINT 
    // HOW DO I ACCESS THE MainActivity INSTANCE HERE 
    } 
} 

のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="arjunvijayakumar.sniffbt"> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"> 
    <!--android:theme="@style/AppTheme"> --> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver 
     android:name=".MyBroadcastReceiver" 
     android:enabled="true" > 
    </receiver> 
</application> 

私はのthro MainActivityのインスタンスにアクセスすることができましたそれはパラメータとしてBroadcastReceiverを取ります。

MainActivityインスタンスをIntentまたはPendingIntentで渡す方法はありますか?事前

答えて

1

おかげで、私は特定の時刻にMainActivityからアラームをトリガーしようとしています。

今後の実際の実装では、2秒後にアラーム以外のものが使用されると想定しています。あなたが本当にはちょうどこのアプリは、今から何か2秒をしたいならば、AlarmManagerBroadcastReceiverものを取り除くと、ちょうど2000ミリ秒が経過した後に実行するRunnableをスケジュールするために、あなたの活動にいくつかのViewpostDelayed()を呼び出します。

私はできませんMyBroadcastReceiver

でMainActivityのインスタンスにアクセスしたいです。ブロードキャストを受信した時点では、MainActivityインスタンスが存在しない可能性があります。

イベントバスの実装を使用し、BroadcastReceiverからイベントを発生させてから、あなたのアクティビティ(存在する場合)にイベントを受け取り何かをさせることができます。アクティビティが存在しない場合(例えば、Notificationを発生させるなど)、十分に記述された実装は代替手段として別のことを行います。はい、あなたが正しいです

+0

:ここ

がために、このの実装です。私は単なる警報以上のことをする予定です。私はAlarmManagerを使用してn時間ごとに実装を実行しています。あなたが言及した実装を調べます。ありがとう。 – AyeVeeKay

+0

@AVK:イベント期間を時間単位で測定すると、あなたはもはや活動をすることはほとんどありません。ユーザーはおそらく他のアプリに移動しており、バックグラウンドにいるときにはいつでもプロセスは終了します。 'CountDownTimer'を持つサービスではなく、あなたのタイミングに' AlarmManager'または 'JobScheduler'を使う必要があります。 – CommonsWare

関連する問題