2017-10-10 33 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); 
    } 
} 
相关问题