Android清单使apk成为平板电脑上的启动器应用程序,但手机上的普通应用

时间:2016-07-05 05:21:47

标签: android android-manifest intentfilter android-launcher

如何让一个apk成为平板电脑上的启动器应用,而只是手机上的普通应用?如何为此配置清单文件?

通过启动器应用程序我的意思是它将显示为在平板电脑上运行apk时的选项之一: Select home picker

如果在手机上运行相同的apk,则不会显示"选择家庭应用"选择器。

简单来说,这是apk需要的行为:

目标:

  • 当我点击手机上的主页时,我应该看不到该应用作为其中一个 发射器选择。
  • 当我点击平板电脑上的主页时,我应 app作为选择之一。

我的方法是使用ChooserActivity.java来确定正在运行的设备类型。如果它是平板电脑,它将启动TabletMainActivity.java,如果它是手机,它将启动PhoneMainActivity.java。 (找出它是平板电脑还是手机的代码是可以的。)

ChooserActivity.java

    public class ChooserActivity extends AppCompatActivity {

    ImageView tabIndicator;
    private static final String TAG = "Chooser";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chooser);
        Log.d(TAG, "onCreate2() Chooser");
        finish();

        if (findViewById(R.id.tabIndicator)==null){
            //PHONE
            startActivity(new Intent(this, PhoneMainActivity.class));

        }else{
            //TABLET
            startActivity(new Intent(this, TabletMainActivity.class));
        }
    }

}

RES /布局/ activity_chooser.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.sample.tabletchecker.Chooser">
<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="PHONE"
    />

</RelativeLayout>

RES /布局sw600dp / activity_chooser.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.sample.tabletchecker.Chooser">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="TABLET"
        />
    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:id="@+id/tabIndicator"
        />
</RelativeLayout>

TabletMainActivity.java具有以下启动器清单设置:

<activity android:name=".TabletMainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <!-- launcher setting -->
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

PhoneMainActivity.java只是一个普通的活动,清单上没有任何内容。这是故意的,因为我希望这项活动是手机上的正常活动。

<activity android:name=".PhoneActivity">

    </activity>

我的ChooserActivity.java是第一个在应用程序被点击/打开时启动的活动,然后它在2之间进行选择。 ChooserActivity清单条目

<activity android:name=".ChooserActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

我尝试了针对TabletMainActivity.java的intent-filter的不同变体,但从未能够获得正确的行为。我总是看到发射器选择器被显示出来。

1 个答案:

答案 0 :(得分:0)

请参阅此答案

Determine if the device is a smartphone or tablet?

http://developer.android.com/training/multiscreen/screensizes.html#TaskUseSWQuali

如果您阅读整个主题,他们会解释如何在特定值文件中设置布尔值(如res / values-sw600dp /):

<resources>
    <bool name="isTablet">true</bool>
</resources>

因为sw600dp限定符仅对android 3.2以上的平台有效。如果您想确保此技术适用于所有平台(3.2之前),请在res / values-xlarge文件夹中创建相同的文件:

<resources>
    <bool name="isTablet">true</bool>
</resources>

然后,在&#34;标准&#34;值文件(作为res / values /),将布尔值设置为false:

<resources>
    <bool name="isTablet">false</bool>
</resources>

然后在您的活动中,您可以获取此值并检查您是否在平板电脑尺寸设备中运行:

检查您选择“意图时的活动”

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {


Intent intent = new Intent(ChooserActivity.this, TabletMainActivity.class);


    startActivity(intent);

} else {
        Intent intent = new Intent(ChooserActivity.this, PhoneMainActivity.class);


    startActivity(intent);


}

Upper Method适用于我

我也为你做了其他方法......

导入

     import android.content.Context;
     import android.content.res.Configuration;
     import android.util.DisplayMetrics;

<强>功能

    public static int FunctionCall(Context context) {

    if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {

             Intent intent=new Intent(this,PhoneMainActivity.class);

            startActivity(intent);
    } 

    else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
        Intent intent=new Intent(this,PhoneMainActivity.class);

                startActivity(intent);

    } 
    else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {

       Intent intent=new Intent(this,TabletMainActivity.class);

                startActivity(intent);


    } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
       Intent intent=new Intent(this,TabletMainActivity.class);

                startActivity(intent);

    }


    return value;
    }

或根据你做