储备知识
类书写以及事件监听
Activity
四种状态
关闭Activity
finish();
Service
1.创建Service
2.代码区点击右键
按住ctrl
3.声明写在onCreate()里面,方法实现写在onStartCommand里面
4.new Thread(new Runnable)
在run里面写实现的方法,后面加上.start()
补充:此Service与Activity无联系
5.在MainActivity里创建Intent对象,然后startService(intent)
代码:
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
Button bt = findViewById(R.id.button);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,MyService.class);
startService(intent);
}
});
BroadcastReceiver
发送广播
//Intent intent2 = new Intent();//注意此处使用无参构造会接收不到,未探究
Intent intent = new Intent(MainActivity.this,MyReceiver.class);
intent2.setAction("Intent对融");
sendBroadcast(intent2);
接收广播
1.创建一个继承BroadcastReceiver的类
2.在onReceive中接收广播
public class MyReceiver extends BroadcastReceiver {
private static final String ACTION_1="cast1";
private static final String ACTION_2="cast2";
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
if(intent.getAction().equals(ACTION_1)){
Toast.makeText(context, "动作1广播接收成功", Toast.LENGTH_SHORT).show();
}
else if(intent.getAction().equals(ACTION_2)){
Toast.makeText(context, "动作2广播接收成功", Toast.LENGTH_SHORT).show();
}
}
}
3.对Intent进行过滤
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="动作1"/>
<action android:name="动作2"/>
</intent-filter>
</receiver>
基础结束,下面正式开始
大作业内容
运用Service和Receiver设计并实现一个应用程序:在Activity里启动系统后台服务,并在启动服务后关闭Activity,接着在操作系统中运行监控,直到手机收到短信之后,判断短信内容里是否有设计好的关键字,一旦发现关键字,则回复短信给发信人,进而达到自动回复的功能。要求在模拟器或真实Android设备上实现此应用程序。
1.创建项目,本次以Kotlin为主
2.创建按钮
activity-button
黄色感叹号,设置resource_value的值为启动服务
在MainActivity里创建按钮
设置按钮监听
val bt = findViewById<Button>(R.id.button)
bt.setOnClickListener {
}
3.创建Service
重写OnCreat和onStartCommand
4.创建广播(Java)
先定义收到短信的事件
private static final String SMS_RECEIVER_ACTION = "android.provider.Telephony.SMS_RECEIVED";
之后OnReceive里写事件·处理程序
完全代码:
package com.example.zhoujinmin;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.widget.Toast;
class MessageReciever extends BroadcastReceiver {
private static final String SMS_RECEIVER_ACTION = "android.provider.Telephony.SMS_RECEIVED";
private String sign = "Re";//检测恢复内容
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
StringBuilder sBuilder = new StringBuilder();
StringBuilder sBuilder2 = new StringBuilder();
SmsManager manager= SmsManager.getDefault();
if(SMS_RECEIVER_ACTION.equals(intent.getAction()))
{
Bundle bundle = intent.getExtras();
if(null != bundle)
{
Object[] pdus = (Object[])bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for(int i = 0; i < messages.length; ++i)
{
messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
}
for(SmsMessage msg : messages)
{
sBuilder.append(msg.getDisplayOriginatingAddress());
sBuilder2.append(msg.getDisplayMessageBody());
}
}
}
Toast.makeText(context, "吆喝,快看!! 您收到了一条短信!!\n" + sBuilder.toString(), Toast.LENGTH_LONG).show();
if (sBuilder2.toString().indexOf(sign) != -1)
manager.sendTextMessage(sBuilder.toString(),null,"收到",null,null);
}
}
5.在Service里添加广播
class MyService : Service() {
var mes:MessageReceiver = MessageReceiver();
override fun onBind(intent: Intent): IBinder {
TODO("Return the communication channel to the service.")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return super.onStartCommand(intent, flags, startId)
}
override fun onCreate() {
val filter = IntentFilter("android.provider.Telephony.SMS_RECEIVED")
registerReceiver(mes, filter)
super.onCreate()
}
}
6.Main里Button启动服务,退出Activity
package com.example.zhoujinmin
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent(this@MainActivity, MyService::class.java)
val bt = findViewById<Button>(R.id.button)
bt.setOnClickListener {
startService(intent)
finish()
}
}
}
7.添加权限
<!-- 接收消息 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 发送消息 -->
<uses-permission android:name="android.permission.SEND_SMS" /> <!-- 阅读消息 -->
<uses-permission android:name="android.permission.READ_SMS" /> <!-- 写入消息 -->
<uses-permission android:name="android.permission.WRITE_SMS" />
8.手机授权
9.启动两个模拟器
在下面可以看到他们的端口号
10.测试
测试成功
原代码
可以私信我
或者去下载