2017-10-10 34 views
2

我有一個Android收音機不會自動啓動應用程序,但它可以從窗口小部件啓動應用程序。我想創建一個小部件來啓動我選擇的各種應用程序,但我希望它們只能打開其他應用程序,然後關閉它們或在後臺打開,因此一旦所有應用程序啓動,主屏幕仍顯示。我已經有一個簡單的AppWidgetProvider我正在使用從另一個項目:Android創建窗口小部件,以啓動其他應用程序,但在後臺

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(); 
        } 
} 

回答

0

好的。以爲我會爲其他可能想在「背景」中啓動應用的人提供一些小小的工作。我使用引號,因爲它實際上不在背景中,但看起來像。

免責聲明:我創建了一個例程來啓動程序,並立即開始後我重新啓動主屏幕。由於我的觀點是要有一個小部件來運行應用程序,通常會得到啓動完成的廣播,如果相同的代碼未被啓動程序活動調用,則可能無法工作。

您還將需要處理有關如何以及何時調用它的邏輯,因爲它會轉到主屏幕。因此,如果所謂的它在前臺有一個活動,它將被移動到後臺。

此外,這不是完整的代碼,但應該足以給你的想法。要求包名的SharedPreference爲true才能啓動應用程序。否則它只是迭代並完成。如果你想放置一個定時器循環,我還包含了一些代碼來處理調用,而不需要重新啓動應用程序。

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); 
    } 
} 
相關問題