2017-10-10 3 views
2

J'ai une radio Android qui ne démarre pas automatiquement les applications, mais il peut démarrer des applications à partir de widgets. Je veux créer un widget qui va démarrer différentes applications que je choisis mais je veux qu'elles ouvrent seulement d'autres applications puis les ferment ou ouvrent en arrière-plan donc une fois toutes les applications démarrées, l'écran d'accueil est toujours affiché. J'ai déjà un AppWidgetProvider simple que j'utilise d'un autre projet:Android créer un widget pour démarrer d'autres applications, mais en arrière-plan

public class AppStarterWidget extends AppWidgetProvider { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 
    } 

    @Override 
    public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, 
         final int[] appWidgetIds) { 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 

     final Handler handler = new Handler(); 

     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 

       for (int widgetId : appWidgetIds) { 
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
          R.layout.widget_layout); 

        remoteViews.setInt(R.id.btnStartActivity, "setBackgroundResource", 
          R.drawable.circle_off); 

        try { 
         Intent intent = new Intent("android.intent.action.MAIN"); 
         intent.addCategory("android.intent.category.LAUNCHER"); 
         intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
         intent.setComponent(new ComponentName("com.my.app", "Qualified name")); 
         PendingIntent pendingIntent = PendingIntent.getActivity(
           context, 0, intent, 0); 
         remoteViews.setOnClickPendingIntent(R.id.btnStartActivity, pendingIntent); 
         appWidgetManager.updateAppWidget(widgetId, remoteViews); 
         //handler.postDelayed(this, 10000); 
        } catch (ActivityNotFoundException e) { 
         Toast.makeText(context.getApplicationContext(), 
           "There was a problem loading the application: ", 
           Toast.LENGTH_SHORT).show(); 
        } 
} 

Répondre

0

Ok. Je pensais que je donnerais un peu de travail pour d'autres qui pourraient vouloir démarrer une application dans le "fond". J'utilise des guillemets parce que ce n'est pas en arrière-plan, mais ça me semble. AVIS DE NON-RESPONSABILITÉ: J'ai créé une routine pour démarrer le programme et, immédiatement après, j'ai relancé l'écran d'accueil. Étant donné que mon objectif était d'avoir un widget pour exécuter des applications qui normalement feraient une diffusion terminée, il y a une possibilité que cela ne fonctionne pas si le même code n'est pas appelé par l'activité du lanceur.

Vous voudrez également traiter de la logique concernant comment et quand cela est appelé parce qu'il va à l'écran d'accueil. Donc, si quelque chose a appelé une activité au premier plan, elle sera déplacée en arrière-plan.

En outre, ce code n'est pas complet mais devrait suffire à vous donner l'idée. Requiert une SharedPreference du nom de fichier comme vrai pour démarrer l'application. Sinon, il ne fait que répéter et est terminé. J'ai également inclus un petit code pour gérer le rappel sans redémarrer les applications encore et encore si vous vouliez mettre dans une boucle de minuterie.

public class LaunchAppInBackground extends AppCompatActivity { 

    static SharedPreferences sPrefs; 
    static boolean bUpdatingAppSelection; 
    private static ArrayList<String> alStartedApps = new ArrayList<>(); 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     sPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
     startAllApps(this); 
    } 

    static void startAllApps(Context context) { 

     if(bUpdatingAppSelection) { 
      return; 
     } 

     final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
     mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
     final List<ResolveInfo> launchables = context.getPackageManager() 
       .queryIntentActivities(mainIntent, 0); 

     // Loop through all apps 
     for (ResolveInfo launchable : launchables) { 

      // If app is in Preferences 
      if (sPrefs.getBoolean(launchable.activityInfo.packageName, false)) { 

       // Check if already launched 
       Log.i("AI", "Checking " + launchable.activityInfo.applicationInfo.packageName); 
       boolean bAlreadyLaunched = false; 
       for (String s : alStartedApps) { 
        if (s.equals(launchable.activityInfo.applicationInfo.packageName)) { 
         bAlreadyLaunched = true; 
        } 
       } 

       // Start if not already launched 
       if (!bAlreadyLaunched) { 
        alStartedApps.add(launchable.activityInfo.applicationInfo.packageName); 
        startApp(launchable, context); 
       } else { 
        Log.i("AI", launchable.activityInfo.applicationInfo.packageName 
          + " already running"); 
       } 
      } 
     } 
    } 

    static void startApp(ResolveInfo launchable, Context context) { 
     if(launchable != null) { 
      ActivityInfo activity = launchable.activityInfo; 
      ComponentName name = new ComponentName(activity.applicationInfo.packageName, 
        activity.name); 
      Intent i = new Intent(Intent.ACTION_MAIN); 
      i.addCategory(Intent.CATEGORY_LAUNCHER); 
      i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
      i.setComponent(name); 
      context.startActivity(i); 
      loadHomeScreen(context); 
      Log.i("AI", "Launched " + activity.applicationInfo.packageName); 
     } 
    } 

    static void loadHomeScreen(Context context) { 
     Intent intent = new Intent(Intent.ACTION_MAIN); 
     intent.addCategory(Intent.CATEGORY_HOME); 
     context.startActivity(intent); 
    } 
}