Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách khởi chạy ứng dụng khác từ ứng dụng của bạn trên Android

Giới thiệu

Android cho phép một ứng dụng khởi chạy (launch) ứng dụng khác thông qua Intent tường minh (explicit) hoặc ngầm định (implicit). Ví dụ này mở YouTube bằng package name.

Các phương pháp

Phương pháp 1: Package Name (Explicit Intent) - Khuyên dùng

Biết trước package name của app đích (VD: com.google.android.youtube).

// Trong Activity/Fragment
Button btnLaunch = findViewById(R.id.btnLaunch);
btnLaunch.setOnClickListener(v -> {
    Intent intent = getPackageManager().getLaunchIntentForPackage("com.google.android.youtube");
    if (intent != null) {
        try {
            startActivity(intent);
        } catch (Exception e) {
            // Xử lý lỗi
        }
    } else {
        // App chưa cài đặt → mở Play Store
        openPlayStore("com.google.android.youtube");
    }
});

private void openPlayStore(String packageName) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("market://details?id=" + packageName));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Phương pháp 2: Implicit Intent (Action + Category)

Không cần biết package name, hệ thống chọn app phù hợp.

// Mở trình duyệt web
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.youtube.com"));
startActivity(intent);

// Chia sẻ văn bản
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, "Xem video này!");
startActivity(Intent.createChooser(share, "Chia sẻ qua"));

// Gửi email
Intent email = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "abc@example.com", null));
email.putExtra(Intent.EXTRA_SUBJECT, "Chủ đề");
startActivity(email);

Phương pháp 3: Kiểm tra app có cài đặt không

public boolean isAppInstalled(String packageName) {
    try {
        getPackageManager().getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Ví dụ hoàn chỉnh (Mở YouTube)

Layout (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnOpenYouTube"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Mở YouTube" />

    <Button
        android:id="@+id/btnOpenBrowser"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Mở YouTube trên trình duyệt" />

</LinearLayout>

MainActivity.java

package com.example.myapplication;

import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnYouTube = findViewById(R.id.btnOpenYouTube);
        Button btnBrowser = findViewById(R.id.btnOpenBrowser);

        btnYouTube.setOnClickListener(v -> openAppByPackage("com.google.android.youtube"));
        btnBrowser.setOnClickListener(v -> openUrl("https://www.youtube.com"));
    }

    private void openAppByPackage(String packageName) {
        Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
        if (intent != null) {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            try {
                startActivity(intent);
            } catch (ActivityNotFoundException e) {
                openPlayStore(packageName);
            }
        } else {
            openPlayStore(packageName);
        }
    }

    private void openUrl(String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        } else {
            Toast.makeText(this, "Không có trình duyệt", Toast.LENGTH_SHORT).show();
        }
    }

    private void openPlayStore(String packageName) {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        }
    }
}

Chạy ứng dụng

Nhấn Run. Màn hình có 2 nút: "Mở YouTube" (mở app YouTube nếu có, không thì Play Store) và "Mở trên trình duyệt".

Cách khởi chạy ứng dụng khác từ ứng dụng của bạn trên Android

Lưu ý bảo mật & Best Practices

  • Luôn dùng intent.resolveActivity() hoặc try-catch ActivityNotFoundException.
  • Android 11+ (API 30): Cần khai báo <queries> trong Manifest để thấy package khác:
<queries>
    <package android:name="com.google.android.youtube" />
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="https" />
    </intent>
</queries>
  • Không lạm dụng launch app khác - trải nghiệm người dùng có thể bị gián đoạn.
  • Dùng FLAG_ACTIVITY_NEW_TASK khi launch từ Service/BroadcastReceiver.