-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
(自认为)优雅的支持跨进程的单例实现机制(toolbox + sample)
- Loading branch information
Showing
26 changed files
with
903 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
5 changes: 5 additions & 0 deletions
5
.../playground/android/me/sr1/androidplayground/sample/mutilprocess/processA/SingletonA.aidl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,5 @@ | |||
package playground.android.me.sr1.androidplayground.sample.mutilprocess.processA; | |||
|
|||
interface SingletonA { | |||
void invokeA(String aString); | |||
} |
5 changes: 5 additions & 0 deletions
5
.../playground/android/me/sr1/androidplayground/sample/mutilprocess/processB/SingletonB.aidl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,5 @@ | |||
package playground.android.me.sr1.androidplayground.sample.mutilprocess.processB; | |||
|
|||
interface SingletonB { | |||
void invokeB(String aString); | |||
} |
5 changes: 5 additions & 0 deletions
5
.../playground/android/me/sr1/androidplayground/sample/mutilprocess/processC/SingletonC.aidl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,5 @@ | |||
package playground.android.me.sr1.androidplayground.sample.mutilprocess.processC; | |||
|
|||
interface SingletonC { | |||
void invokeC(String aString); | |||
} |
3 changes: 3 additions & 0 deletions
3
...id/me/sr1/androidplayground/toolbox/component/mutilprocess/singleton/InstanceCarrier.aidl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,3 @@ | |||
package playground.android.me.sr1.androidplayground.toolbox.component.mutilprocess.singleton; | |||
|
|||
parcelable InstanceCarrier; |
7 changes: 7 additions & 0 deletions
7
...d/me/sr1/androidplayground/toolbox/component/mutilprocess/singleton/InstanceTransfer.aidl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,7 @@ | |||
package playground.android.me.sr1.androidplayground.toolbox.component.mutilprocess.singleton; | |||
|
|||
import playground.android.me.sr1.androidplayground.toolbox.component.mutilprocess.singleton.InstanceCarrier; | |||
|
|||
interface InstanceTransfer { | |||
InstanceCarrier transfer(); | |||
} |
105 changes: 105 additions & 0 deletions
105
...a/playground/android/me/sr1/androidplayground/sample/mutilprocess/processA/ActivityA.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,105 @@ | |||
package playground.android.me.sr1.androidplayground.sample.mutilprocess.processA; | |||
|
|||
import android.content.Context; | |||
import android.content.Intent; | |||
import android.os.*; | |||
import android.support.v7.app.AppCompatActivity; | |||
import android.util.Log; | |||
import android.widget.Button; | |||
import android.widget.TextView; | |||
import android.widget.Toast; | |||
|
|||
import butterknife.Bind; | |||
import butterknife.ButterKnife; | |||
import butterknife.OnClick; | |||
import playground.android.me.sr1.androidplayground.App; | |||
import playground.android.me.sr1.androidplayground.R; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processB.ActivityB; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processB.ServiceB; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processB.SingletonBImp; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processC.ServiceC; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processC.SingletonCImp; | |||
import playground.android.me.sr1.androidplayground.toolbox.component.mutilprocess.singleton.InstanceReceiver; | |||
import playground.android.me.sr1.androidplayground.toolbox.utils.AppUtils; | |||
|
|||
/** | |||
* @author SR1s | |||
*/ | |||
public class ActivityA extends AppCompatActivity { | |||
|
|||
private static String TAG = "ActivityA"; | |||
|
|||
@Bind(R.id.textView1) TextView mTextView1; | |||
|
|||
@Bind(R.id.button0) Button mBtn0; | |||
|
|||
@Bind(R.id.button1) Button mBtn1; | |||
|
|||
@Bind(R.id.button2) Button mBtn2; | |||
|
|||
@Bind(R.id.button3) Button mBtn3; | |||
|
|||
@Override | |||
protected void onCreate(Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_abc); | |||
ButterKnife.bind(this); | |||
|
|||
mTextView1.setText("这里是主进程A"); | |||
mBtn0.setText("启动进程B"); | |||
mBtn1.setText("调用本主进程A的方法)"); | |||
mBtn2.setText("调用其他进程B的方法"); | |||
mBtn3.setText("调用其他进程C的方法"); | |||
|
|||
/** 把其他进程的单例绑定过来 */ | |||
bindService(ServiceB.class); | |||
bindService(ServiceC.class); | |||
} | |||
|
|||
void bindService(Class<?> clz) { | |||
Intent intent = new Intent(this, clz); | |||
bindService(intent, new InstanceReceiver(), Context.BIND_AUTO_CREATE); | |||
} | |||
|
|||
@OnClick(R.id.button0) | |||
void startActivty() { | |||
Intent intent = new Intent(this, ActivityB.class); | |||
startActivity(intent); | |||
} | |||
|
|||
@OnClick(R.id.button1) | |||
void invokeAInstance() { | |||
try { | |||
Log.i(TAG, String.format("[%s][invokeA][pid=%d][tid=%d]", AppUtils.currentProcessName(), | |||
android.os.Process.myPid(), android.os.Process.myTid())); | |||
SingletonAImp.getInstance().invokeA(AppUtils.currentProcessName()); | |||
Toast.makeText(App.getContext(), "调用A单例方法", Toast.LENGTH_SHORT).show(); | |||
} catch (Exception e) { | |||
Log.e(TAG, "[invokeA][fail]", e); | |||
} | |||
} | |||
|
|||
@OnClick(R.id.button2) | |||
void invokeBInstance() { | |||
try { | |||
Log.i(TAG, String.format("[%s][invokeB][pid=%d][tid=%d]", AppUtils.currentProcessName(), | |||
android.os.Process.myPid(), android.os.Process.myTid())); | |||
SingletonBImp.getInstance().invokeB(AppUtils.currentProcessName()); | |||
Toast.makeText(App.getContext(), "调用B单例方法", Toast.LENGTH_SHORT).show(); | |||
} catch (Exception e) { | |||
Log.e(TAG, "[invokeB][fail]", e); | |||
} | |||
} | |||
|
|||
@OnClick(R.id.button3) | |||
void invokeCInstance() { | |||
try { | |||
Log.i(TAG, String.format("[%s][invokeC][pid=%d][tid=%d]", AppUtils.currentProcessName(), | |||
android.os.Process.myPid(), android.os.Process.myTid())); | |||
SingletonCImp.getInstance().invokeC(AppUtils.currentProcessName()); | |||
Toast.makeText(App.getContext(), "调用单例C方法", Toast.LENGTH_SHORT).show(); | |||
} catch (Exception e) { | |||
Log.e(TAG, "[invoke][fail]", e); | |||
} | |||
} | |||
} |
8 changes: 8 additions & 0 deletions
8
...va/playground/android/me/sr1/androidplayground/sample/mutilprocess/processA/ServiceA.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,8 @@ | |||
package playground.android.me.sr1.androidplayground.sample.mutilprocess.processA; | |||
|
|||
import playground.android.me.sr1.androidplayground.toolbox.component.mutilprocess.singleton.BaseService; | |||
|
|||
/** | |||
* @author SR1s | |||
*/ | |||
public class ServiceA extends BaseService {} |
56 changes: 56 additions & 0 deletions
56
...ayground/android/me/sr1/androidplayground/sample/mutilprocess/processA/SingletonAImp.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,56 @@ | |||
package playground.android.me.sr1.androidplayground.sample.mutilprocess.processA; | |||
|
|||
import android.content.Context; | |||
import android.content.Intent; | |||
import android.os.*; | |||
import android.os.Process; | |||
import android.util.Log; | |||
import android.widget.Toast; | |||
|
|||
import playground.android.me.sr1.androidplayground.App; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.utils.MainThreadUtils; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.utils.ProcessUtils; | |||
import playground.android.me.sr1.androidplayground.toolbox.component.mutilprocess.singleton.InstanceReceiver; | |||
import playground.android.me.sr1.androidplayground.toolbox.utils.AppUtils; | |||
|
|||
/** | |||
* @author SR1s | |||
*/ | |||
public class SingletonAImp extends SingletonA.Stub { | |||
|
|||
public static SingletonA INSTANCE; | |||
|
|||
public static synchronized SingletonA getInstance() { | |||
if (ProcessUtils.isProcessA()) { | |||
if (INSTANCE == null) { | |||
INSTANCE = new SingletonAImp(); | |||
} | |||
return INSTANCE; | |||
} else { | |||
if (INSTANCE == null) { | |||
/** 自发重连 */ | |||
Intent intent = new Intent(App.getContext(), ServiceA.class); | |||
App.getContext().bindService(intent, new InstanceReceiver(), Context.BIND_AUTO_CREATE); | |||
} | |||
return INSTANCE; | |||
} | |||
} | |||
|
|||
private SingletonAImp() {} | |||
|
|||
public static final String TAG = "SingletonAImp"; | |||
|
|||
@Override | |||
public void invokeA(final String aString) throws RemoteException { | |||
MainThreadUtils.runOnMainThread(new Runnable() { | |||
@Override | |||
public void run() { | |||
Toast.makeText(App.getContext(), | |||
String.format("[SingletonA]\n[调用进程:%s]\n[执行进程:%s]\n", aString, AppUtils.currentProcessName()), | |||
Toast.LENGTH_SHORT).show(); | |||
} | |||
}); | |||
Log.i(TAG, String.format("[%s][invokeA][pid=%d][tid=%d]", | |||
aString, android.os.Process.myPid(), Process.myTid())); | |||
} | |||
} |
105 changes: 105 additions & 0 deletions
105
...a/playground/android/me/sr1/androidplayground/sample/mutilprocess/processB/ActivityB.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,105 @@ | |||
package playground.android.me.sr1.androidplayground.sample.mutilprocess.processB; | |||
|
|||
import android.content.Context; | |||
import android.content.Intent; | |||
import android.os.*; | |||
import android.support.v7.app.AppCompatActivity; | |||
import android.util.Log; | |||
import android.widget.Button; | |||
import android.widget.TextView; | |||
import android.widget.Toast; | |||
|
|||
import butterknife.Bind; | |||
import butterknife.ButterKnife; | |||
import butterknife.OnClick; | |||
import playground.android.me.sr1.androidplayground.App; | |||
import playground.android.me.sr1.androidplayground.R; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processA.ServiceA; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processA.SingletonAImp; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processC.ActivityC; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processC.ServiceC; | |||
import playground.android.me.sr1.androidplayground.sample.mutilprocess.processC.SingletonCImp; | |||
import playground.android.me.sr1.androidplayground.toolbox.component.mutilprocess.singleton.InstanceReceiver; | |||
import playground.android.me.sr1.androidplayground.toolbox.utils.AppUtils; | |||
|
|||
/** | |||
* @author SR1s | |||
*/ | |||
public class ActivityB extends AppCompatActivity { | |||
|
|||
private static String TAG = "ActivityB"; | |||
|
|||
@Bind(R.id.textView1) TextView mTextView1; | |||
|
|||
@Bind(R.id.button0) Button mBtn0; | |||
|
|||
@Bind(R.id.button1) Button mBtn1; | |||
|
|||
@Bind(R.id.button2) Button mBtn2; | |||
|
|||
@Bind(R.id.button3) Button mBtn3; | |||
|
|||
@Override | |||
protected void onCreate(Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_abc); | |||
ButterKnife.bind(this); | |||
|
|||
mTextView1.setText("这里是进程B"); | |||
mBtn0.setText("启动进程C"); | |||
mBtn1.setText("调用主进程A的方法)"); | |||
mBtn2.setText("调用本进程B的方法"); | |||
mBtn3.setText("调用其他进程C的方法"); | |||
|
|||
/** 把其他进程的单例绑定过来 */ | |||
bindService(ServiceA.class); | |||
bindService(ServiceC.class); | |||
} | |||
|
|||
void bindService(Class<?> clz) { | |||
Intent intent = new Intent(this, clz); | |||
bindService(intent, new InstanceReceiver(), Context.BIND_AUTO_CREATE); | |||
} | |||
|
|||
@OnClick(R.id.button0) | |||
void startActivty() { | |||
Intent intent = new Intent(this, ActivityC.class); | |||
startActivity(intent); | |||
} | |||
|
|||
@OnClick(R.id.button1) | |||
void invokeAInstance() { | |||
try { | |||
Log.i(TAG, String.format("[%s][invokeA][pid=%d][tid=%d]", AppUtils.currentProcessName(), | |||
android.os.Process.myPid(), android.os.Process.myTid())); | |||
SingletonAImp.getInstance().invokeA(AppUtils.currentProcessName()); | |||
Toast.makeText(App.getContext(), "调用A单例方法", Toast.LENGTH_SHORT).show(); | |||
} catch (Exception e) { | |||
Log.e(TAG, "[invokeA][fail]", e); | |||
} | |||
} | |||
|
|||
@OnClick(R.id.button2) | |||
void invokeBInstance() { | |||
try { | |||
Log.i(TAG, String.format("[%s][invokeB][pid=%d][tid=%d]", AppUtils.currentProcessName(), | |||
android.os.Process.myPid(), android.os.Process.myTid())); | |||
SingletonBImp.getInstance().invokeB(AppUtils.currentProcessName()); | |||
Toast.makeText(App.getContext(), "调用B单例方法", Toast.LENGTH_SHORT).show(); | |||
} catch (Exception e) { | |||
Log.e(TAG, "[invokeB][fail]", e); | |||
} | |||
} | |||
|
|||
@OnClick(R.id.button3) | |||
void invokeCInstance() { | |||
try { | |||
Log.i(TAG, String.format("[%s][invokeC][pid=%d][tid=%d]", AppUtils.currentProcessName(), | |||
android.os.Process.myPid(), android.os.Process.myTid())); | |||
SingletonCImp.getInstance().invokeC(AppUtils.currentProcessName()); | |||
Toast.makeText(App.getContext(), "调用单例C方法", Toast.LENGTH_SHORT).show(); | |||
} catch (Exception e) { | |||
Log.e(TAG, "[invoke][fail]", e); | |||
} | |||
} | |||
} |
8 changes: 8 additions & 0 deletions
8
...va/playground/android/me/sr1/androidplayground/sample/mutilprocess/processB/ServiceB.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,8 @@ | |||
package playground.android.me.sr1.androidplayground.sample.mutilprocess.processB; | |||
|
|||
import playground.android.me.sr1.androidplayground.toolbox.component.mutilprocess.singleton.BaseService; | |||
|
|||
/** | |||
* @author SR1s | |||
*/ | |||
public class ServiceB extends BaseService {} |
Oops, something went wrong.