2016-07-04 9 views
0

Ich möchte alle Tätigkeiten meine Anwendungen beenden von Rundfunkempfänger, wenn der Bildschirm ausgeschaltet ist: Zuerst habe ich eine statische Referenz in meine Aktivitäten wie folgt:Fertig Alle Aktivitäten von Rundfunkempfänger

public class MainActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener { 



public static AppCompatActivity ma; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //set instance of ma equals to MainActivity 
    ma=this; 


    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 

    }); 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 
} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 

    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is  present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
public void displayView(int viewId) { 

    Fragment fragment = null; 
    String title = getString(R.string.app_name); 

    switch (viewId) { 
     case R.id.monthly_figures: 
      fragment = new dailysales(); 
      title = "Daily Figures"; 

      break; 
     case R.id.nav_gallery: 
      fragment=new monthlysales(); 
      title="Monthly Figures"; 
      break; 


    } 

    if (fragment != null) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.content_frame, fragment); 
     ft.commit(); 
    } 

    // set the toolbar title 
    if (getSupportActionBar() != null) { 
     getSupportActionBar().setTitle(title); 
    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 

} 

dann Call ist aus meine BroadCastReceiver Klasse wie folgt:

public class SCBroadcaster extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ 
    MainActivity.ma.finish(); 
    } 
    } 
} 

Glaubst du, es gibt noch einen besseren Weg? Ich habe versucht, System.Exit (0) oder process.killprocess (myPid) aufzurufen, aber wenn der Bildschirm wieder eingeschaltet wird, wird die gesamte Anwendung neu gestartet. Danke.

+0

Können Sie Ihre gesamte "MainActivity" veröffentlichen? – user3793589

+0

Ich nehme an, dass die Verwendung von System.Exit (0) kein gutes Verhalten für die App ist :). Für welche Zwecke möchten Sie Aktivitäten beenden? – comrade

+0

Der Zweck, dass die Anwendung auf alle Arten geschlossen werden muss, auch wenn der Benutzer vergessen hat (wenn er das Telefon zur Seite legt), so wenn der Bildschirm ausgeschaltet ist alles geschlossen. – Albert

Antwort

1

Android ist nicht gut dafür eingerichtet. Die Idee des Frameworks ist, dass die App niemals geschlossen und immer wieder an derselben Stelle geöffnet werden kann. Ich halte es für eine schlechte Idee (einige Apps müssen aus Sicherheitsgründen nach einer Zeitüberschreitung geschlossen werden), aber so funktioniert es.

So sehr ich sie hasse, ich denke, ein Event-Bus ist der richtige Weg hier zu gehen. Melden Sie sich in onCreate für jedes Event-Event an. Lassen Sie den Empfänger das Ereignis senden, wenn er den Bildschirm ausschaltet (oder einen anderen gewünschten Auslöser). Wenn die Aktivität dieses Ereignis empfängt, rufe sie finish() auf. Um die Dinge einfacher zu machen, codieren Sie dieses Verhalten in eine Basisaktivitätsklasse und lassen Sie alle Aktivitäten von dieser Klasse anstatt direkt von Aktivität ableiten.