我在SO上发现了许多类似的已回答问题,但在我看来,所有这些问题都与我的略有不同。
我有MainActivity类,该类可以调用在同一类中定义的addInfo()函数。还请考虑addInfo函数访问activity_主布局。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
String[] saInfoTxt = {"App Started"};
addInfo("APP",saInfoTxt);
...
}
public void addInfo(String sType, String[] saInfoTxt) {
Date dNow = Calendar.getInstance().getTime();
DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
String sNow = dateFormat.format(dNow);
LinearLayout layout = (LinearLayout) findViewById(R.id.info);
String sInfoTxt =TextUtils.join("\n", saInfoTxt);
sInfoTxt= sType + " " + sNow + "\n" + sInfoTxt;
TextView txtInfo = new TextView(this);
txtInfo.setText(sInfoTxt);
txtInfo.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
((LinearLayout) layout).addView(txtInfo);
};
}
现在,我有第二个类,可以响应接收器来拦截传入的SMS。此类需要重新调用MainActivity.addInfo()函数,但我无法执行此操作:
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
// get sms objects
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus.length == 0) {
return;
}
// large message might be broken into many
SmsMessage[] messages = new SmsMessage[pdus.length];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sb.append(messages[i].getMessageBody());
}
String sender = messages[0].getOriginatingAddress();
String message = sb.toString();
String[] saInfoTxt = {"Sender: " + sender,"Message: " + message};
MainActivity.addInfo("SMS", saInfoTxt);
}
}
}
}
如果我将addInfo()定义为静态,则内部代码有问题。如果我将其保留为非静态,则第二个类看不到addInfo()
有人可以指出我正确的方向吗?
预先感谢
答案 0 :(得分:1)
在这种情况下,您需要提取方法并创建一个新类,在其中编写所有与业务相关的代码。当将与业务相关的代码隔离在其他类中时,您可以轻松地在每个活动中调用或访问您的业务方法。或者,您可以创建一些实用程序类。
答案 1 :(得分:0)
您遇到的最简单的解决方案之一是使用EventBus或类似的方法在应用程序组件之间广播事件。由于在BroadcastReceiver接收到意图时您的Activity可能不活跃,因此您需要在Activity和Receiver之间建立松散的耦合。
这是使用EventBus的示例实现,请确保首先将其包含在依赖项中(https://github.com/greenrobot/EventBus):
// Event.java
class Event {
private String text;
private String[] array;
public Event(String text, String[] array) {
this.text = text;
this.array = array;
}
public String getText() { return text; }
public String[] getArray() { return array; }
}
// SmsReceiver.java(而不是直接调用活动)
EventBus.getDefault().post(new Event("SMS", saInfoTxt));
// MainActivity.java
void onCreate() {
..
EventBus.getDefault().register(this); // registers event listener
}
void onDestroy() {
EventBus.getDefault().unregister(this); // unregister event listener (important!)
}
@Subscribe(threadMode = ThreadMode.MAIN)
void onEvent(Event event) {
addInfo(event.getText(), event.getArray());
}
如果要在没有EventBus或RxJava的情况下解决该问题,也可以将Intent发送到Activity并处理Activity.onNewIntent()中的数据。
答案 2 :(得分:0)
创建界面:
public Interface CallBackInterface{
void getData(String key, String[] arr);
}
关于应用程序类:
public class BaseApplication extends Application
{
CallBackInterface event=null;
....// getter and setter
void setEvent(CallBackInterface event)
{
this.event=event;
}
}
关于活动课:
BaseApplication.getInstance.setEvent(new CallBackInterface()
{
@Override
public void getData(String key,String[] arr) {
//stuff to do....
}
});
在SmsReceiver类上
....
if(BaseApplication.getInstance.getEvent!=null){
BaseApplication.getInstance.getEvent.sendData("SMS", saInfoTxt);
}
答案 3 :(得分:-1)
将所有所需的代码从其他类移到一个类中,并使该类静态。如果这不是一种选择,则使您的活动成为单个实例:
public static MainActivity Instance;
OnCreate:
Instance = this;
现在无论您身在何处都可以通话:
MainActivity.Instance.addInfo();