-1

だから、私はうまく動作する放送受信機を持っています。問題は、呼び出されたときにクラスがBroadcastReceiverを継承し、ActivityやFragmentは継承しないため、フラグメントを変更できないということです。したがって、私はgetFragmentManager()またはgetSupportFragmentManager()へのアクセス権を持っていません。私はどのように進むのか分からず、何か助けに感謝しています。ブロードキャスト受信者からフラグメントを変更する

BroadcastReceiverクラス:

package lucaclock.moticlock; 

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.Toast; 

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver { 

public static final String numAlarmsPreferences = "numAlarmsPreferences"; 
public static final String numAlarmsKey = "numAlarmsKey"; 
public static final String alarm1Preferences = "alarm1Preferences"; 
public static final String alarm2Preferences = "alarm2Preferences"; 
public static final String alarm3Preferences = "alarm3Preferences"; 
public static final String alarm4Preferences = "alarm4Preferences"; 
public static final String alarmTimeDisplayKey = "alarmTimeDisplayKey"; 
public static final String alarmTimeRequestedKey = "alarmTimeRequestedKey"; 
public static final String alarmNameKey = "alarmNameKey"; 
public static final String alarmOccuranceKey = "alarmOccuranceKey"; 
public static final String alarmActiveKey = "alarmActiveKey"; 
public static final String alarmSoundUriKey = "alarmSoundUriKey"; 
public static final String alarmSoundTitleKey = "alarmSoundTitleKey"; 
public static final String alarmVolumeKey = "alarmVolumeKey"; 
public static final String alarmSnoozeKey = "alarmSnoozeKey"; 
public static final String alarmVisibleKey = "alarmVisibleKey"; 
public static final String alarmRunningKey = "alarmVisibleKey"; 
public boolean alarm1Active; 
public boolean alarm2Active; 
public boolean alarm3Active; 
public boolean alarm4Active; 

public void onReceive(Context context, Intent intent) { 
    WakeLocker.acquire(context); 

    MainActivity mA = new MainActivity(); 
    mA.updateFragment(HomeFragment.class, null); 

    Toast.makeText(context, "ALARM ACTIVE!!!", Toast.LENGTH_LONG).show(); 

    /*---------------THIS CODE IS RUN WHEN THE ALARM IS ACTIVE----------------------// 
    // 
    //------------------------------------------------------------------------------// 
    */ 

    //initialize preferences 
    AppSharedPreferences alarm1Prefs = AppSharedPreferences.getInstance(context, alarm1Preferences); 
    AppSharedPreferences alarm2Prefs = AppSharedPreferences.getInstance(context, alarm2Preferences); 
    AppSharedPreferences alarm3Prefs = AppSharedPreferences.getInstance(context, alarm3Preferences); 
    AppSharedPreferences alarm4Prefs = AppSharedPreferences.getInstance(context, alarm4Preferences); 

    alarm1Active = alarm1Prefs.getBoolean(alarmActiveKey, false); 
    alarm2Active = alarm2Prefs.getBoolean(alarmActiveKey, false); 
    alarm3Active = alarm3Prefs.getBoolean(alarmActiveKey, false); 
    alarm4Active = alarm4Prefs.getBoolean(alarmActiveKey, false); 



} 

public void cancelAlarm(Context context) 
{ 
    Toast.makeText(context, "Alarm canceled successfully", Toast.LENGTH_LONG).show(); 
    Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.cancel(sender); 

    AppSharedPreferences mPref = AppSharedPreferences.getInstance(context, alarm1Preferences); 
    mPref.putBoolean(alarmRunningKey, false); 
    mPref.putBoolean(alarmActiveKey, false); 

    WakeLocker.release(); 
} 
} 

答えて

0

あなたは自分のBroadcastReceiverActivityで年代onResume()を登録し、onStop()に登録解除する必要がやりたいです。あなたがBroadcastReceiverを登録できるところの下のサンプルを見てください。

public class MyActivity extends Activity { 
    // ... 
    private BroadcastReceiver mReceiver; 

    // ... 

    @Override 
    public void onStart() { 
     super.onStart(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("..."); 
     // ... 
     mReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context pContext, Intent pIntent) { 
       String action = pIntent.getAction(); 
       // ... 
      } 
     }; 

     registerReceiver(mReceiver, filter); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if (mReceiver != null) { 
      unregisterReceiver(mReceiver); 
     } 
    } 
} 

私の更新MainActivityクラス:

package lucaclock.moticlock; 

import android.app.AlarmManager; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.app.PendingIntent;  
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Toast; 


public class MainActivity extends AppCompatActivity { 
//public static int numAlarms = 0; 

public boolean alarm1Active; //means the alarm is set and will go off when specified time is reached 
public boolean alarm1Visible = true; //means the alarm has been added and is now visible on the main screen 
public boolean alarm2Visible = true; 
public boolean alarm2Active; 
public boolean alarm3Visible = true; 
public boolean alarm3Active; 
public boolean alarm4Visible = true; 
public boolean alarm4Active; 
public AlarmManager alarmManager; 
public PendingIntent alarmIntent; 
public static final String numAlarmsPreferences = "numAlarmsPreferences"; 
public static final String numAlarmsKey = "numAlarmsKey"; 
public static final String alarm1Preferences = "alarm1Preferences"; 
public static final String alarm2Preferences = "alarm2Preferences"; 
public static final String alarm3Preferences = "alarm3Preferences"; 
public static final String alarm4Preferences = "alarm4Preferences"; 
public static final String alarmTimeDisplayKey = "alarmTimeDisplayKey"; 
public static final String alarmTimeRequestedKey = "alarmTimeRequestedKey"; 
public static final String alarmDateKey = "alarmDateKey"; 
public static final String alarmNameKey = "alarmNameKey"; 
public static final String alarmOccuranceKey = "alarmOccuranceKey"; 
public static final String alarmActiveKey = "alarmActiveKey"; 
public static final String alarmRunningKey = "alarmRunningKey"; 
public static final String alarmSoundUriKey = "alarmSoundUriKey"; 
public static final String alarmSoundTitleKey = "alarmSoundTitleKey"; 
public static final String alarmVolumeKey = "alarmVolumeKey"; 
public static final String alarmSnoozeKey = "alarmSnoozeKey"; 
public static final String alarmVisibleKey = "alarmVisibleKey"; 
private AlarmManagerBroadcastReceiver alarm; 
private BroadcastReceiver mReceiver; 
public boolean alarm1Running; 
public View view; 
public boolean devMode = true; 
public boolean fragSwitch; 
//private AHBottomNavigation bottomNavigation; 
//private ArrayList<com.aurelhubert.ahbottomnavigation.AHBottomNavigationItem> menuItemsList; 
//public boolean firstRun; 
public int currentFragment; //1 = HomeFragment 2 = AddAlarmFragment 3 = DeleteAlarmFragment 

@Override 
public void onStart() { 
    super.onStart(); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction("..."); 
    // ... 
    mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context pContext, Intent pIntent) { 
      String action = pIntent.getAction(); 

      Toast.makeText(getApplicationContext(), "We have received the alarm!", Toast.LENGTH_LONG).show(); 
      thirdFragment tFrag = new thirdFragment(); 
      replaceFragment(tFrag); 
     } 
    }; 

    registerReceiver(mReceiver, filter); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (mReceiver != null) { 
     unregisterReceiver(mReceiver); 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Context context = this.getApplicationContext(); 

    Toolbar tb = (Toolbar) findViewById(R.id.my_toolbar); 
    setSupportActionBar(tb); 
    currentFragment = 1; 


    if(devMode = true) { 
     final FloatingActionButton fabClearPref = (FloatingActionButton) findViewById(R.id.fabClearPref); 
     fabClearPref.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       for (int i = 0; i < 5; i++) { 
        HomeFragment hFrag = new HomeFragment(); 
        if (i == 0) { 
         AppSharedPreferences mPref = AppSharedPreferences.getInstance(getApplicationContext(), alarm1Preferences); 
         mPref.clearPref(); 
         hFrag.numAlarmsGlobal = 0; 
        } else if (i == 1) { 
         AppSharedPreferences mPref = AppSharedPreferences.getInstance(getApplicationContext(), alarm2Preferences); 
         mPref.clearPref(); 
         hFrag.numAlarmsGlobal = 0; 
        } else if (i == 2) { 
         AppSharedPreferences mPref = AppSharedPreferences.getInstance(getApplicationContext(), alarm3Preferences); 
         mPref.clearPref(); 
         hFrag.numAlarmsGlobal = 0; 
        } else if (i == 3) { 
         AppSharedPreferences mPref = AppSharedPreferences.getInstance(getApplicationContext(), alarm4Preferences); 
         mPref.clearPref(); 
         hFrag.numAlarmsGlobal = 0; 
        } else if (i == 4) { 
         AppSharedPreferences mPref = AppSharedPreferences.getInstance(getApplicationContext(), numAlarmsPreferences); 
         mPref.clearPref(); 
         hFrag.numAlarmsGlobal = 0; 
        } 
        fabClearPref.setVisibility(View.INVISIBLE); 

       } 

      } 
     }); 
     fabClearPref.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) 
      { 
       fabClearPref.setVisibility(View.INVISIBLE); 

       return true; 
      } 

     }); 
    } 


    /*---------------THIS IS THE ACTUAL ALARM----------------// 
    //-----------THAT SHOWS UP WHEN THE SET TIME-------------// 
    //---------------AND THE ACTUAL TIME MATCH---------------// 
    */ 
    AppSharedPreferences alarm1Prefs = AppSharedPreferences.getInstance(this.getApplicationContext(), alarm1Preferences); 
    AppSharedPreferences alarm2Prefs = AppSharedPreferences.getInstance(this.getApplicationContext(), alarm2Preferences); 
    AppSharedPreferences alarm3Prefs = AppSharedPreferences.getInstance(this.getApplicationContext(), alarm3Preferences); 
    AppSharedPreferences alarm4Prefs = AppSharedPreferences.getInstance(this.getApplicationContext(), alarm4Preferences); 

    /* 
    alarm1Active = alarm1Prefs.getBoolean(alarmActiveKey, false); 
    alarm2Active = alarm2Prefs.getBoolean(alarmActiveKey, false); 
    alarm3Active = alarm3Prefs.getBoolean(alarmActiveKey, false); 
    alarm4Active = alarm4Prefs.getBoolean(alarmActiveKey, false); 
    */ 

    //alarm1Active = true; 

    Fragment homeFragment = new HomeFragment(); 
    replaceFragment(homeFragment); 
    //fabClearPref.setVisibility(View.INVISIBLE); 
    //initBottomBar(); 

} 

public void readPreferences(View view) 
{ 
    //dialogBuilder("VERIFICATION 0x12", "Reading Preferences!"); 

    AppSharedPreferences alarm1Pref = AppSharedPreferences.getInstance(getApplicationContext(), alarm1Preferences); 
    AppSharedPreferences alarm2Pref = AppSharedPreferences.getInstance(getApplicationContext(), alarm2Preferences); 
    AppSharedPreferences alarm3Pref = AppSharedPreferences.getInstance(getApplicationContext(), alarm3Preferences); 
    AppSharedPreferences alarm4Pref = AppSharedPreferences.getInstance(getApplicationContext(), alarm4Preferences); 

    alarm1Active = alarm1Pref.getBoolean(alarmActiveKey, false); 
    alarm1Running = alarm1Pref.getBoolean(alarmRunningKey, false); 
    //TODO: Add alarm2 booleans when alarm1 booleans confirmed working 

} 

public void replaceFragment(Fragment fragment) 
{ 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    //fragmentTransaction.setCustomAnimations(enterTransition, exitTransition); 
    fragmentTransaction.replace(R.id.frame_container, fragment); 
    //fragmentTransaction.addToBackStack(fragment.toString()); 
    fragmentTransaction.commit(); 
} 

public void updateFragment(Class<?> clazz, Bundle args) { 
    String tag = clazz.getName(); 
    FragmentManager fragmentManager = getFragmentManager(); 
    Fragment fragment = fragmentManager.findFragmentByTag(tag); 
    if (fragment == null) { 
     fragment = Fragment.instantiate(this, tag, args); 
     fragment.setRetainInstance(true); 
    } 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    transaction.addToBackStack(tag); 
    transaction.replace(R.id.frame_container, fragment, tag); 
    transaction.commit(); 
} 

public void onBackPressed() 
{ 
    FragmentManager fm = getFragmentManager(); 
    DialogView dv = new DialogView(); 
    dv.show(fm, "Fragment"); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu items for use in the action bar 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.options_menu, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
     case R.id.menu_home: 
      HomeFragment homeFragment = new HomeFragment(); 
      replaceFragment(homeFragment); 

      return false; 
     case R.id.menu_alarm: 
       thirdFragment alarmFragment = new thirdFragment(); 
       replaceFragment(alarmFragment); 
       currentFragment = 2; 

      return true; 
     /*case R.id.menu_deletealarm: 
       thirdFragment deleteAlarmFragment = new thirdFragment(); 
       replaceFragment(deleteAlarmFragment); 
       currentFragment = 3; 

      return true;*/ 
     case R.id.menu_settings: 
      fourthFragment settingsFragment = new fourthFragment(); 
      replaceFragment(settingsFragment); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
    } 
    /* 
    FloatingActionButton fabAddAlarm = (FloatingActionButton)  findViewById(R.id.fabAddAlarm); 
    fabAddAlarm.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 

      setContentView(R.layout.activity_addalarm); 
     } 
    }); 
    */ 
} 
+0

ありがとうございます!しかし、私はこれを尊重する質問があります。これにはonReceive()が含まれているので、受信者としてこのアクティビティを指すようにマニフェストを変更する必要があるのでしょうか? – 2JZIgnition

+0

アクティビティのライフサイクルでのみ登録します。私は放送がManifestの登録された受信者によって送信されると思います、正しいですか? – Toochka

+0

あなたのアドバイスに従って、私のMainActivityクラスで投稿を更新しました。私のBroadcastReceiverクラスはうまく機能しているようですが、Toastは呼び出されたときに表示されますが、私のonReceiveは自分のアクティビティでは呼び出されていないようです。私は2つのonReceiveメソッドを持っている可能性がありますが、1つだけ持っている必要がありますか? – 2JZIgnition

関連する問題