工程目錄:



app-MainActivity
package com.example.app;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
findViewById(R.id.btn4).setOnClickListener(this);
findViewById(R.id.btn5).setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = getPackageManager().getLaunchIntentForPackage("com.example.app1");
switch(v.getId()){
case R.id.btn1:
intent = getPackageManager().getLaunchIntentForPackage("com.example.app1");
break;
case R.id.btn2:
intent = getPackageManager().getLaunchIntentForPackage("com.example.app2");
break;
case R.id.btn3:
intent = getPackageManager().getLaunchIntentForPackage("com.example.app3");
break;
case R.id.btn4:
intent = getPackageManager().getLaunchIntentForPackage("com.example.app4");
break;
case R.id.btn5:
intent = getPackageManager().getLaunchIntentForPackage("com.example.app5");
break;
}
if (intent == null) {
Toast.makeText(getApplicationContext(),"沒有安裝該app",Toast.LENGTH_SHORT).show();
} else {
startActivity(intent);
}
}
}
Layout
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="系統廣播,接收短信放音樂(靜態注冊)" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="短信廣播,接收短信顯示內容(靜態注冊)" />
<Button
android:id="@+id/btn3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="系統廣播,按鈕停止音樂服務(停止服務)" />
<Button
android:id="@+id/btn4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="自定義廣播(動態注冊)" />
<Button
android:id="@+id/btn5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="使用PendingIntent創建通知" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
app1-MainActivity
package com.example.app1;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{"android.permission.RECEIVE_SMS"},1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if(grantResults[0]!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "未授權,無法實作預定的功能!", Toast.LENGTH_SHORT).show();
finish();
}
}
}
@Override
protected void onDestroy() { //按手機回傳鍵時觸發
super.onDestroy();
//創建組件物件
ComponentName receiver = new ComponentName(this,SmsReceiver.class);
//獲取包管理器物件
PackageManager pm = getPackageManager();
//禁用一個靜態注冊的廣播接收者
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
}
SmsReceiver
package com.example.app1;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MediaPlayer mediaPlayer = MediaPlayer.create(context,R.raw.cc);
mediaPlayer.start();
}
}
manifestes
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app1">
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".SmsReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
app2-manifestes
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app2">
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".SmsReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity
package com.example.app2;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{"android.permission.RECEIVE_SMS"},1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if(grantResults[0]!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "未授權,無法實作預定的功能!", Toast.LENGTH_SHORT).show();
finish();
}
}
}
@Override
protected void onDestroy() { //按手機回傳鍵時觸發
super.onDestroy();
//創建組件物件
ComponentName receiver = new ComponentName(this,SmsReceiver.class);
//獲取包管理器物件
PackageManager pm = getPackageManager();
//禁用一個靜態注冊的廣播接收者
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
}
SmsReceiver
package com.example.app2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//獲取發送短信意圖物件攜帶的資料
Bundle bundle = intent.getExtras();
if(bundle != null){
//可使用動態除錯,查看短信資料結構
Object[] pdus = (Object[]) bundle.get("pdus");
//發送方的一條短信可能被分割、分多次發送
SmsMessage[] msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
byte[] pdu = (byte[]) pdus[i];
//獲取分段的短信
msgs[i]= SmsMessage.createFromPdu(pdu);
}
//構建短信相關資訊字串
StringBuilder strb=new StringBuilder();
for(SmsMessage msg:msgs){
strb.append("\n發短信人電話:\n")
.append(msg.getDisplayOriginatingAddress())
.append("\n短信內容:\n")
.append(msg.getMessageBody());
//接收時間
Date date=new Date(msg.getTimestampMillis());
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
strb.append("\n短信接收時間:\n").append(sdf.format(date));
}
//在context指示的背景關系(就是模塊的MainActivity)里打Toast訊息
Toast.makeText(context, strb, Toast.LENGTH_LONG).show();
}
}
}
app3-manifestes
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app3">
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".SmsReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<service
android:name=".MyAudioService"
android:enabled="true"
android:exported="true" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity
package com.example.app3;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btnStop;
private boolean isCast; //是否為廣播激活
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{"android.permission.RECEIVE_SMS"},1);
}
btnStop=findViewById(R.id.btnStop);
Intent intent = getIntent(); //獲取廣播意圖物件
isCast = intent.getBooleanExtra("iscast", false); //默認值為false
btnStop.setEnabled(isCast); //設定停止按鈕可用和單擊監聽
if(isCast) Toast.makeText(this, "正在播放音樂...", Toast.LENGTH_SHORT).show();
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
//顯式服務呼叫意圖(非系結式)
Intent intent=new Intent(MainActivity.this,MyAudioService.class);
//在Activity組件里,停止音樂播放服務
stopService(intent);
finish(); //銷毀本活動
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if(grantResults[0]!= PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "未授權,無法實作預定的功能!", Toast.LENGTH_SHORT).show();
finish();
}else{
Toast.makeText(this, "請發一條短信驗證...", Toast.LENGTH_SHORT).show();
}
}
}
}
MyAudioService
package com.example.app3;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class MyAudioService extends Service {
MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
mediaPlayer = MediaPlayer.create(this,R.raw.cc);
mediaPlayer.start();
}
@Override
public void onDestroy() {
mediaPlayer.stop();
}
}
SmsReceiver
package com.example.app3;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, MyAudioService.class);
//在廣播組件里,通過背景關系物件啟動音樂播放服務組件
context.startService(serviceIntent);
//新建呼叫Activity組件的意圖
Intent activityIntent = new Intent(context, MainActivity.class);
activityIntent.putExtra("iscast", true); //攜帶資料
//新建堆疊用來存放被啟動的Activity(當已經存在時,只做移動處理)
activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//在廣播組件里,通過背景關系物件啟動Activity組件
context.startActivity(activityIntent);
}
}
Layout
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btnStop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Stop Music" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
app4-MainActivity
package com.example.app4;
import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private TextView tv; //用于顯示接收到的廣播資訊
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle mybundle = intent.getExtras();
String str1 = mybundle.getString("data1");
String str2 = mybundle.getString("data2");
Toast.makeText(context, str1+" " +str2, Toast.LENGTH_LONG).show();
tv.setText(str1+" " +str2);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用意圖過濾器類IntentFilter動態注冊廣播接收者
IntentFilter myintentfliter = new IntentFilter();
myintentfliter.addAction("com.example.broadcast.MY_BROADCAST");
registerReceiver(myReceiver, myintentfliter);
tv = findViewById(R.id.tv);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent myintent = new Intent("com.example.broadcast.MY_BROADCAST");
Bundle bundle = new Bundle();
bundle.putString("data1", "自定義廣播與接收案例");
bundle.putString("data2", "我是自定義的字串!");
myintent.putExtras(bundle); //捆綁資料
sendBroadcast(myintent); //發送廣播
try {
Thread.sleep(1000); //休眠一下,模擬廣播可能存在的延遲
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
Layout
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="運行時快速發廣播" />
<TextView
android:id="@+id/tv"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
app5-MainActivity
package com.example.app5;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
NotificationManager notificationManager; //通知管理器
NotificationCompat.Builder builder; //通知構造器(與Android版本相關)
Button btn_notification; //按鈕
boolean isCreate = false; //通知未創建
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_notification = findViewById(R.id.btn_notification);
//創建設定意圖物件
Intent intent = new Intent(Settings.ACTION_SETTINGS);
//創建延期意圖物件
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,0);
//獲取通知管理器
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//使用通知構造器
builder = new NotificationCompat.Builder(this,getPackageName());
//構建通知內容
builder.setSmallIcon(R.drawable.ic_launcher_foreground) //圖示使用矢量圖形
.setContentTitle("進入設定界面")
.setContentText("點擊進入設定界面")
.setWhen(System.currentTimeMillis())
.setDefaults(Notification.DEFAULT_SOUND)
.setContentIntent(pendingIntent); //關鍵方法
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //Android 8.0
NotificationChannel channel = new NotificationChannel( //Android 8.0需要創建通知頻道
getPackageName(),
"MusicNotify",
NotificationManager.IMPORTANCE_DEFAULT
);
notificationManager.createNotificationChannel(channel);
}
btn_notification.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isCreate = !isCreate; //在創建與取消之間切換
TextView tv=findViewById(R.id.hide_tv);
if(isCreate) { //如果準備創建通知
//發送通知至通知欄
notificationManager.notify(1, builder.build()); //發通知
tv.setVisibility(View.VISIBLE); //設定可見
btn_notification.setText("取消通知");
}else {
notificationManager.cancel(1); //取消通知
btn_notification.setText("創建通知");
tv.setVisibility(View.INVISIBLE); //設定不可見
}
}
});
}
}
Layout
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_notification"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="發通知" />
<TextView
android:id="@+id/hide_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="invisible"
android:gravity="center"
android:text="通知已創建,請下拉查看!" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
app1:

app2:

app3:

app4:

app5:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/162842.html
標籤:其他
上一篇:自定義回應資料結構
下一篇:Android課程表界面布局實作
